所有,我今天发现了冰咖啡脚本,并且很高兴看到有人尝试为异步编程设计更易读的咖啡脚本方言。
我无法通过地图和减少功能等理解来工作,或者更简单地做/为。例如。 ......的输出。
square = (x, callback) ->
setTimeout ->
callback x * x
, 5000
console.log [ 1..10 ].map (x) ->
await square x, defer y
y
...只是一个未定义的数组!我错过了什么?提前谢谢。
Giacecco
答案 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
。