JavaScript:逐个执行异步函数

Way*_* Ye 5 javascript asynchronous

我有一个简单的"异步"JS函数:

function asyncFunc(i) {
    setTimeout(function () {
        console.log(i);
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

如果我想在for循环中执行此asyncFunc 5次,即每秒记录1 - 5次,总共花费5秒.

1

2

3

4

我知道jQuery的when().done()可以做到这一点但是如果我在没有第三方JS库的环境中, 实现这个的最简单和优雅的方法是什么?

实际上,例如我想编写一个接受异步函数数组的util函数,这个util函数可以逐个执行函数执行:

function execAsyncTasks([asyncTask1, asyncTask2, asyncTask3]) {
    asyncTask1();
    // Wait until asyncTask1 finished
    asyncTask2();
    // Wait until asyncTask2 finished
    asyncTask3();
    // Wait until asyncTask3 finished
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*und 9

您的所有任务都必须实现某种回调机制,因为这是您知道异步任务已完成的唯一方法.有了这个,你可以这样做:

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);
Run Code Online (Sandbox Code Playgroud)

演示