Javascript /节点检查一个循环callback完成
存在某种方法来知道node.js(js)中的asynchronous循环是否完成了执行新函数或发送callback的最后一个过程?
你需要使用recursion:
do = function(i, data, callback){ // if the end is reached, call the callback if(data.length === i+1) return callback() obj = data[i] doAsync(function(){ // DO SOMETHING i++; // call do with the next object do(i, data, callback) }); } do(0, [a, b, c], function(){ THEN DO SOMETHING });
因此,同样的callback将被传递,当到达结束时,callback将被执行。 这个方法很干净,例如,如果你需要抓取50个页面,每个页面将被加载到一个队列中,等待另一个完成之前。
使用这个function
| google.com | yahoo.fr | SO.com | github.com | calling callback! | (856ms) | (936ms) | (787ms) | (658ms) |
没有
| google.com (1056ms) | | yahoo.fr (1136ms) | | SO.com (987ms) | | github.com (856ms) |
因此,另一种方法是统计asynchronous函数应该被调用多less次,每次结束时,你增加一个var,当var达到这个长度时,调用callback函数。
do = function(data, callback){ var done = 0; data.forEach(function(i, value){ doAsync(function(){ done++; if(done === data.length) callback() }); }); } do(0, [a, b, c], function(){ THEN DO SOMETHING });
那就是了
| google.com (1056ms) | | yahoo.fr (1136ms) | calling callback! | SO.com (987ms) | | github.com (856ms) | done = 0 1234
看看这个图书馆。 看来每个迭代器都适合你的需求。