迭代每个元素的数组运行asynchronous任务

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

我想同步,所以每个元素将被处理,一旦前面的元素已经完成。 我到目前为止所尝试的是:

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

然而这个循环永远(我相信i在callback函数中超出了范围)。

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

我认为以下内容可以完成您正在寻找的内容:

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

fn是一个函数,只要索引小于长度,callback就等于自身。 然后,我打电话给fn一次,以启动它。 这是一个小提琴:

http://jsfiddle.net/8A8CG/


或者,如果asyncFunc返回一个promise ,则可以使用Array#reduce来处理一系列的项目:

 function processItems(items) { return items.reduce((promise, item) => { return promise.then(() => asyncFunc(item)); }, Promise.resolve()); } 

如果需要串行执行一组asynchronous函数,我强烈推荐节点的asynchronous模块 。 它提供了一系列连续执行asynchronous任务的方法。 它还提供了一个瀑布方法,将前一个任务的结果传递给下一个任务。

哎呀。 你正在寻找每个系列 。 以下是它如何为你工作:

 var async = require('async'); async.eachSeries(items, asyncFunc, function(err){ if(err) return "OH NO"; return "Yay!"}) 

确保asyncFunc调用带有错误或null的callback。