在使用基于async.series
的设计时,我必须在功能块中使用循环,如下所示:
var someFile = filePath;
async.series([
function(cb) {
_.forEach (
someDataList,
function (item) {
//call that executes out of sync
writeToFile(someFile,item)
//how to provide callback here
cb(); //<- is this correct - won't this take control out of this block in the very first loop iteration?
}
);
}
],
//callback function
function (err) {...}
);
答案 0 :(得分:2)
要了解有关异步的更多信息,您可以使用他们的方法each。
将函数iteratee并行应用于coll中的每个项目。该 使用列表中的项目调用iteratee,并使用when的回调 它已经完成了。如果iteratee将错误传递给它的回调,那么 主要回调(对于每个函数)立即调用 错误。
您的代码可以转换为:
var someFile = filePath;
async.series([
function (cb) {
async.each(someDataList, function (item, callback) {
//call that executes out of sync
writeToFile(someFile,item)
// Execute internal callback for `async.each`
callback()
}, function (error) {
if (error) {
cb(error)
} else {
cb()
}
})
}
],
//callback function
function (err) {...
}
);
但是,当然,你需要看看你的writeToFile
功能。
如果是sync
,则需要将其包含在try {} catch(e){}
构造中,并在catch部分中运行错误callback()
的内部callback(error)
。
答案 1 :(得分:2)
您可以改为使用forEachSeries。
var someFile = filePath;
async.forEachSeries(someDataList, function(item, cb) {
writeToFile(someFile, item)
cb();
},
//callback function
function () {...}
);
评论后更新:
不幸的是,无法在forEachSeries中获取iteratee的索引。如果你想要iteratee的索引,你可以使用eachOfSeries
var someFile = filePath;
async.eachOfSeries(someDataList, function(value, key, callback) {
//Do something with key
writeToFile(someFile, item)
callback();
}, //callback function
function () {...}
);