在每个元素上迭代运行异步任务的数组

时间:2014-07-24 02:12:51

标签: javascript multithreading node.js asynchronous

我有一个项目列表,我想在每个项目上运行异步任务。

我想要同步,以便在前面的元素完成后处理每个元素。到目前为止我尝试过的是:

function processItems(items) {
    var i = 0;
    while(i < items.length) {
      asyncFunc(items[i], function() { i++ }); // asyncFunc takes a callback parameter       
    }
}

然而,这永远循环(我相信i超出了回调函数的范围。)

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:5)

我认为以下内容可以实现您的目标:

function processItems(items) {
    var i = 0,
        length = items.length,
        fn = function() {
            if(i < length) {
                asyncFunc(items[i], fn);
                i++;
            }
        };

    fn();
}

fn是一个函数,只要索引小于长度,就将回调设置为等于它自己。然后我拨打fn一次以启动它。这是一个小提琴:

http://jsfiddle.net/8A8CG/


或者,如果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调用回调。