我有一个简单的“异步”JS函数:
function asyncFunc(i) {
setTimeout(function () {
console.log(i);
}, 1000);
}
如果我想在for循环中执行此asyncFunc 5次,即每秒记录1 - 5次,总共花费5秒。
1
2
3
4
5
我知道jQuery的when()。done()可以做到这一点但是如果我在没有第三方JS库的环境中,实现这个的最简单和优雅的方法?
实际上我想编写一个函数接受一个异步函数数组的函数,这个util函数可以逐个执行函数执行:
function execAsyncTasks([asyncTask1, asyncTask2, asyncTask3]) {
asyncTask1();
// Wait until asyncTask1 finished
asyncTask2();
// Wait until asyncTask2 finished
asyncTask3();
// Wait until asyncTask3 finished
}
答案 0 :(得分:8)
您的所有任务都必须实现某种回调机制,因为这是您知道异步任务已完成的唯一方法。有了这个,你可以做类似的事情:
function executeTasks() {
var tasks = Array.prototype.concat.apply([], arguments);
var task = tasks.shift();
task(function() {
if(tasks.length > 0)
executeTasks.apply(this, tasks);
});
}
executeTasks(t1, t2, t3, t4);
答案 1 :(得分:2)
您可以使用Async模块:
https://github.com/caolan/async
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
]);
答案 2 :(得分:0)
这是许多
的一种方法function execAsyncTasks(asyncTask1, asyncTask2, asyncTask3) {
var count = 0;
function nextCommand() {
switch (count) {
case 0:
asyncTask1();
break;
case 1:
asyncTask2();
break;
case 2:
asyncTask3();
default:
return;
}
count++;
setTimeout(nextCommand, 1000);
}
nextCommand();
}
答案 3 :(得分:0)
您可以使用回调和递归函数调用来实现同步机制:see http://jsfiddle.net
function asyncFunc(i, callback) {
setTimeout(function() {
document.body.innerHTML += '<p>' + i + '</p>';
callback();
}, 1000);
}
var args = [0, 1, 2, 3, 4];
function loopThroughArgs(callback) {
if (args.length == 0) {
callback();
} else {
asyncFunc(args[0], function() {
args.splice(0, 1); //remove the first item from args array
loopThroughArgs(callback);
});
}
}
loopThroughArgs(function() {
document.body.innerHTML += '<p>done !</p>';
});