我有一个项目列表,我想在每个项目上运行异步任务。
我想要同步,以便在前面的元素完成后处理每个元素。到目前为止我尝试过的是:
function processItems(items) {
var i = 0;
while(i < items.length) {
asyncFunc(items[i], function() { i++ }); // asyncFunc takes a callback parameter
}
}
然而,这永远循环(我相信i
超出了回调函数的范围。)
有没有更好的方法来实现这一目标?
答案 0 :(得分:5)
我认为以下内容可以实现您的目标:
function processItems(items) {
var i = 0,
length = items.length,
fn = function() {
if(i < length) {
asyncFunc(items[i], fn);
i++;
}
};
fn();
}
fn
是一个函数,只要索引小于长度,就将回调设置为等于它自己。然后我拨打fn
一次以启动它。这是一个小提琴:
或者,如果asyncFunc
返回promise,您可以使用Array#reduce
处理系列中的项目:
function processItems(items) {
return items.reduce((promise, item) => {
return promise.then(() => asyncFunc(item));
}, Promise.resolve());
}
答案 1 :(得分:1)
如果需要串行执行一组异步功能,我强烈推荐async module节点。 <击> 它提供了series方法来串行执行异步任务。它还提供了一个waterfall方法,可以将上一个任务的结果传递给下一个任务。 击>
糟糕。您正在寻找eachSeries。以下是它可能对你有用的方法:
var async = require('async');
async.eachSeries(items, asyncFunc, function(err){ if(err) return "OH NO"; return "Yay!"})
确保asyncFunc
使用错误或null调用回调。