Я должен выполнить набор асинхронных методов (клиентская база данных SQLite) и назвать только один заключительный обратный вызов.
Конечно, ужасный путь:
execAll : function(callBack) {
asynch1(function() {
asynch2(function() {
...
asynchN(function() {
callBack();
})
})
});
}
Но я знаю, что существуют лучшие способы сделать это. Интуитивно я обнаружил бы, когда все перезванивают, был назван с в противоречии с вызовом заключительный обратный вызов.
Я думаю, что это - общий шаблон разработки, поэтому если кто-то мог бы указать на меня в правильном направлении...
Заранее спасибо!
это просто
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);
Я написал несколько асинхронных утилит, которые могут оказаться полезными, позволяя вам написать ваш пример как:
function(callback) {
async.series([
asynch1(),
asynch2(),
...
asynchN()
], callback);
}
Или, если вы хотите запускать их параллельно, как:
function(callback) {
async.parallel([
asynch1(),
asynch2(),
...
asynchN()
], callback);
}
Есть множество других полезных функций, таких как асинхронные map/reduce:
http://caolanmcmahon.com/async.html
Надеюсь, это поможет!