javascript:用一个回调执行一堆异步方法

Sam*_*uel 14 javascript design-patterns asynchronous callback

我需要执行一堆异步方法(客户端SQLite数据库),并且只调用一个最终回调.

当然,丑陋的方式是:

execAll : function(callBack) {
        asynch1(function() {
            asynch2(function() {
                ...
                asynchN(function() {
                    callBack();
                })
            })
        });
    }
Run Code Online (Sandbox Code Playgroud)

但我知道有更好的方法可以做到这一点.直观地,我会检测何时使用计数器调用所有回调以调用最终回调.

我认为这是一种常见的设计模式,所以如果有人能指出我正确的方向......

提前致谢 !

Sea*_*sey 20

这很简单

var callback = (function(){
    var finishedCalls = 0;
    return function(){
        if (++finishedCalls == 4){
             //execute your action here
        }
    };
})();
Run Code Online (Sandbox Code Playgroud)

只需将此回调传递给您的所有方法,一旦它被调用4次就会执行.

如果您想使用工厂,那么您可以执行以下操作

function createCallback(limit, fn){
    var finishedCalls = 0;
    return function(){
        if (++finishedCalls == limit){
             fn();
        }
    };
}


var callback = createCallback(4, function(){
    alert("woot!");
});


async1(callback);
async2(callback);
async3(callback);
async4(callback);
Run Code Online (Sandbox Code Playgroud)


Cao*_*lan 8

我写了一些您可能觉得有用的异步实用程序,允许您将您的示例编写为:

function(callback) {
    async.series([
        asynch1(),
        asynch2(),
        ...
        asynchN()
    ], callback);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想并行运行它们,请执行以下操作:

function(callback) {
    async.parallel([
        asynch1(),
        asynch2(),
        ...
        asynchN()
    ], callback);
}
Run Code Online (Sandbox Code Playgroud)

还有许多其他有用的函数,如async map/reduce:

http://caolanmcmahon.com/async.html

希望有所帮助!