无法通过map或reduce等理解获得冰咖啡脚本

时间:2012-12-14 17:25:47

标签: iced-coffeescript

所有,我今天发现了冰咖啡脚本,并且很高兴看到有人尝试为异步编程设计更易读的咖啡脚本方言。

我无法通过地图和减少功能等理解来工作,或者更简单地做/为。例如。 ......的输出。

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

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

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

Giacecco

2 个答案:

答案 0 :(得分: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在这里不起作用,因为回调通常不能保证以你想要的顺序返回。

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

答案 1 :(得分: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