迭代每个元素的数组运行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
一次,以启动它。 这是一个小提琴:
或者,如果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。