2012-12-14 25 views
0

今天我發現了冰咖啡腳本,很高興看到有人試圖爲異步編程設計更可讀的咖啡腳本方言。無法獲得帶有諸如地圖或縮小等理解的冰咖啡腳本

我不能通過諸如地圖和縮小功能之類的理解,或者更簡單地做/爲了得到解凍。例如。輸出...

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

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

...只是一個未定義的數組!我錯過了什麼?先謝謝你。

Giacecco

回答

1

我是新來的冰鎮的,但這裏是我的理解:

使用的await並推遲不會真正停止控制流,你的函數將返回如常。因此.map會爲每個元素返回「undefined」。

這裏的串行版本,如上:

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不會在這裏工作,因爲回調一般不能保證返回訂購你想要的。

還有很多其他方法可以做到這一點,但我認爲這是最簡單的方法來做你想做的事情。請注意,如果它是一個大循環,它將首先分配整個數組,這可能是低效的。

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