JavaScript: выполните набор асинхронного метода с одним обратным вызовом

Я должен выполнить набор асинхронных методов (клиентская база данных SQLite) и назвать только один заключительный обратный вызов.

Конечно, ужасный путь:

execAll : function(callBack) {
        asynch1(function() {
            asynch2(function() {
                ...
                asynchN(function() {
                    callBack();
                })
            })
        });
    }

Но я знаю, что существуют лучшие способы сделать это. Интуитивно я обнаружил бы, когда все перезванивают, был назван с в противоречии с вызовом заключительный обратный вызов.

Я думаю, что это - общий шаблон разработки, поэтому если кто-то мог бы указать на меня в правильном направлении...

Заранее спасибо!

14
задан Samuel 26 May 2010 в 11:08
поделиться

2 ответа

это просто

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);
20
ответ дан 1 December 2019 в 09:01
поделиться

Я написал несколько асинхронных утилит, которые могут оказаться полезными, позволяя вам написать ваш пример как:

function(callback) {
    async.series([
        asynch1(),
        asynch2(),
        ...
        asynchN()
    ], callback);
}

Или, если вы хотите запускать их параллельно, как:

function(callback) {
    async.parallel([
        asynch1(),
        asynch2(),
        ...
        asynchN()
    ], callback);
}

Есть множество других полезных функций, таких как асинхронные map/reduce:

http://caolanmcmahon.com/async.html

Надеюсь, это поможет!

8
ответ дан 1 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: