2012-07-16 56 views
2

是否有一些類似於下劃線的框架允許我在集合上運行異步方法。Node.js中的異步收集方法

類似於_.each(collection,itemCallback,doneCallback)。

例如:

_.each(items, function(item, token){ 
    item.someProperty = null; 
    }, function(err){ 
    console.log("The loop is done"); 
    }); 

編輯: async.js其實並不能解決這個問題。例如下面的代碼

<script type="text/javascript" src="async.js"></script> 
<script type="text/javascript"> 

var arr = ["a","b","c"]; 

async.forEach(arr, function(item, met){ 
    console.log(item); 
}, 
function(err){ 
}); 
console.log("Done"); 

</script> 

打印ABC完成

雖然我希望它打印完成ABC

我可以用下劃線deffer做,但也許有一些其他的LIB是可以不用包裝。

+2

[Async.js](https://github.com/caolan/async/)來拯救。 :)有趣的是,你使用*異步*名稱,並不知道'異步'模塊。 :) – freakish 2012-07-16 10:22:46

+0

你是對的:)。我正在使用Async.js來控制流程,不知怎的,我完全錯過了集合部分。 – Buzzy 2012-07-16 10:28:19

回答

17

Async.js模塊將做的伎倆。你的例子太快了,你不能完全注意到它實際上正如你所期望的那樣工作。下面是添加了這樣你就可以看到執行的實際訂單延遲小的例子:

async.each([0,1,2,3,4,5,6,7,8,9], function(item, callback) { 
    setTimeout(function() { 
    console.log('>', item); 
    callback(); 
    }, 2 * Math.random() * 1000); 
}, function(err) { 
    console.log('> done'); 
}); 

console.log(':)'); 

和輸出:

:) 
> 4 
> 5 
> 2 
> 7 
> 8 
> 3 
> 0 
> 1 
> 9 
> 6 
> done 

而且,要真正做到這一點異步你可能會考慮使用Web Workers ;但現在Async.js爲您提供了一個非常簡單的方法做類似的(但不是實際的Web工人)命名queue東西:

var q = async.queue(function(item, callback) { 
    setTimeout(function() { 
    console.log('>>', item); 
    callback(); 
    }, 2 * Math.random() * 1000); 
}, 5); 

q.drain = function() { 
    console.log('>> done'); 
}; 

q.push([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); 

console.log('B)'); 

和輸出:

B) 
>> 1 
>> 2 
>> 5 
>> 6 
>> 4 
>> 3 
>> 0 
>> 7 
>> 8 
>> 9 
>> done 

如果最後你同時運行同時,這裏是一個輸出示例:

:) 
B) 
>> 2 
> 3 
>> 4 
>> 1 
> 8 
>> 6 
> 7 
> 1 
> 4 
>> 3 
> 0 
> 2 
>> 7 
>> 5 
> 6 
> 5 
> 9 
> done 
>> 8 
>> 0 
>> 9 
>> done 
+0

這個答案似乎被棄用。 Async.js文檔沒有提到有關async.forEach函數的任何信息。 – bzupnick 2013-12-31 14:00:59

+1

@bzupnick現在只需調用[Each](https://github.com/caolan/async#each)。謝謝埃裏克的解釋。 – Jacinto 2014-01-05 22:03:05

+0

是的,我打賭他們改變了它,以獲得距離原生forEach的距離,這實際上阻止了I/O – Maziyar 2014-08-17 13:04:49