我需要执行一系列异步方法(客户机SQLite数据库),并且只调用一个最终回调。
当然,丑陋的方式是:
execAll : function(callBack) {
asynch1(function() {
asynch2(function() {
...
asynchN(function() {
callBack();
})
})
});
}但我知道有更好的方法。直觉上,我会检测到,当所有的回调都被一个计数器调用时,就会调用最终的回调。
我觉得这是个普通的design-pattern,所以如果有人能给我指明正确的方向.
提前谢谢!
发布于 2010-05-26 10:02:30
这很容易
var callback = (function(){
var finishedCalls = 0;
return function(){
if (++finishedCalls == 4){
//execute your action here
}
};
})();只需将此回调传递给所有方法,一旦它被调用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);发布于 2010-07-09 10:23:47
我编写了一些您可能认为有用的异步实用程序,允许您将示例编写为:
function(callback) {
async.series([
asynch1(),
asynch2(),
...
asynchN()
], callback);
}或者,如果您想并行运行它们,如:
function(callback) {
async.parallel([
asynch1(),
asynch2(),
...
asynchN()
], callback);
}还有很多其他有用的函数,如异步map/reduce:
http://caolanmcmahon.com/async.html
希望这能帮上忙!
发布于 2013-05-15 02:34:53
您应该考虑在异步方法中使用延迟模式。您可以从以下StackOverflow问题和答案中获得更多信息:
What are the differences between Deferred, Promise and Future in JavaScript?
来自jnewman的显著答案实际上是好的!
希望这能有所帮助。
https://stackoverflow.com/questions/2911822
复制相似问题