我必须处理一个 entries
数组,需要为每个文件条目执行异步任务:getFile
和 uploadResult
都是异步的任务。我的问题是如何知道何时使用 asyncjs 等异步库处理数组 doc.entries 。下面的代码只是我想要实现的目标的说明。
var doc = {
version: '1.7',
entries: [{
date: '11/11/10',
files: [{
name: 100,
executable: false
},
{
name: 101,
executable: false
}]
},
{
date: '11/12/10',
files: [{
name: 200,
executable: false
},
{
name: 201,
executable: false
}]
},
{
date: '11/13/10',
files: [{
name: 300,
executable: false
}]
},
{
date: '11/14/10',
files: [{
name: 400,
executable: false
}]
}]
};
doc.entries.map(function(entry){
entry.files.map(function(file){
getFile(file, function(err, result){
if(err){
throw Error(err)
}
uploadResult(result, function(err, status){
WriteOnDb(file.name, status, function(err, result){ ... });
});
})
});
});
我如何知道最后一个文件何时存储在数据库上,然后执行其他操作?
谢谢。
最佳答案
最简单的方法是使用 Promise 或更好的可观察量,但您也可以使用回调来实现 - 例如,您可以计算总共有多少任务以及完成了多少任务:
var total = doc.entries
.map(function (entry) {
return entry.files.length;
})
.reduce(function (x, acc) {
return acc + x
}, 0);
var finished = 0;
function finishCallback(err) {
if (err === null) {
/// all async tasks are finished;
}
}
doc.entries.map(function (entry) {
entry.files.map(function (file) {
getFile(file, function (err, result) {
if (err) {
finishCallback(err);
} else {
uploadResult(result, function (err, status) {
WriteOnDb(file.name, status, function (err, result) {
if (err) {
finishCallback(err);
} else {
finished += 1;
if (finished === total) finishCallback(null);
}
});
});
}
})
});
});
关于javascript - 确定异步执行何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055022/