在完成许多异步工作后,是否有一种调用函数的标准方法?我循环遍历N个文件,我调用异步函数。在循环之后,我调用了done(),这导致了一个bug直到我意识到它,因为在循环结束时由于异步调用,工作仍在完成。
无论如何不是编写我自己的倒计时代码是否有一种标准的方式可以说所有这些函数/异步调用完成后调用此代码?
答案 0 :(得分:3)
创建一个计数器以保存已处理的事物数(最初设置为0)
然后调用你的assync操作,向每个操作传递一个
的回调函数done()
基本思路是这样,但你可能需要添加一些额外的东西来处理错误。
如果您有幸使用同步性库,可能会有一些功能为您执行此操作。例如,Dojo有这种同步的dojo.DeferredList。
答案 1 :(得分:0)
我倾向于使用这种东西:
function TaskList(tasks, endOfTasksCallback) {
this.doTasks = function () {
var numTasks = tasks.length;
function singleTaskCallback() {
if (--numTasks == 0) {
endOfTasksCallback();
}
}
for (var i = 0; i < tasks.length; i++) {
tasks[i](singleTaskCallback);
}
}
}
function createTask(taskIdx) {
// a task is a function that does some work
// for this demo it's simply a random wait
return function (endOfTaskCallback) {
var ms = Math.floor(Math.random() * 1000 * 5);
var startTime = new Date().getTime();
setTimeout(function () {
var endTime = new Date().getTime();
console.log("task " + taskIdx + " completed in " + (endTime-startTime) + "ms.");
endOfTaskCallback();
}, ms);
}
}
var numTasks = 10;
var tasks = [];
for (var i = 0; i < numTasks; i++) {
tasks.push(createTask(i));
}
new TaskList(tasks, function () {
console.log("all done!");
}).doTasks();
你得到这样的输出:
task 3 completed in 215ms.
task 5 completed in 1365ms.
task 2 completed in 2020ms.
task 4 completed in 2360ms.
task 0 completed in 2595ms.
task 6 completed in 2940ms.
task 9 completed in 3220ms.
task 1 completed in 3515ms.
task 8 completed in 3560ms.
task 7 completed in 4845ms.
all done!