0

总而言之,我今天发现了 iced-coffee-script,很高兴看到有人尝试为异步编程设计一种更具可读性的咖啡脚本方言。

尽管使用 map 和 reduce 函数之类的理解,或者更简单的 do/for,但我无法工作。例如...的输出

square = (x, callback) ->
  setTimeout ->
      callback x * x
    , 5000

console.log [ 1..10 ].map (x) ->
  await square x, defer y
  y  

...只是一个未定义的数组!我错过了什么?先感谢您。

贾塞科

4

2 回答 2

1

我是冰的新手,但这是我的理解:

使用 await 和 defer 实际上并不会停止控制流,您的函数将照常返回。所以 .map 正在为每个元素返回“未定义”。

这是串行版本,如上:

foo = []
for x in [ 1..10 ]
  await square x, defer y
  foo.push y

如果你想并行执行,它是这样的:

foo = []
await
  for x,i in ([ 1..10 ])
    square x, defer foo[i]

请注意,我将 [1..10] 范围括在括号中。这是为了将范围扩展到一个数组,所以我们可以在循环内获取索引,在这里解释:https ://github.com/jashkenas/coffee-script/issues/2586

.push 在这里不起作用,因为通常不能保证回调按您想要的顺序返回。

有很多其他方法可以做到这一点,但我认为这是完成您在上面尝试做的最简洁的方法。请注意,如果它是一个大循环,它将首先分配整个数组,这可能效率低下。

于 2012-12-17T00:17:02.617 回答
0

我会将我的 2 美分添加到@doubledriscoll 的答案中,这样您就可以更好地了解这里实际发生的情况。让我们将您的代码示例翻译成常规的 javascript,所以这段代码:

console.log [ 1..10 ].map (x) ->
  await square x, defer y
  y  

相当于:

console.log([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(x) {
  return square(x, function(y) {
    return y;
  });
});

它将打印square函数返回的事物数组,即undefined.

于 2013-01-15T06:32:26.280 回答