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)
我写了一些您可能觉得有用的异步实用程序,允许您将您的示例编写为:
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
希望有所帮助!