Как правильно объединить асинхронные вызовы в javascript?

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

Это то, чем я сейчас занимаюсь.

var syncProduct = (function() {
    var done, log;
    var IN_CAT = 1, IN_TITLES = 2, IN_BINS = 3;
    var state = IN_CAT;
    var processNext = function(data) {
        switch(state) {
            case IN_CAT:
                SVC.sendJsonRequest(url("/api/lineplan/categories"), processNext);
                state = IN_TITLES;
                break;
            case IN_TITLES:
                log((data ? data.length : "No") + " categories retrieved!");
                SVC.sendJsonRequest(url("/api/lineplan/titles"), processNext);
                state = IN_BINS;
                break;
            case IN_BINS:
                log((data ? data.length : "No") + " titles retrieved!");
                SVC.sendJsonRequest(url("/api/lineplan/bins"), processNext);
                state = IN_MAJOR;
                break;
            default:
                log((data ? data.length : "No") + " bins retrieved!");
                done();
                break;
        }
    }
    return {
        start: function(doneCB, logCB) {
            done = doneCB; log = logCB; state = IN_CAT;
            processNext();
        }
    }
})();

Я бы тогда назвал это следующим образом

var log = function(message) {
    // Impl removed.
}

syncProduct.start(function() {
    log("Product Sync Complete!");
}, log);

Хотя это прекрасно работает для меня, я не могу не думать, что должен быть лучший (более простой) способ. Что произойдет позже, когда мои рекурсивные вызовы станут слишком глубокими?

ПРИМЕЧАНИЕ : Я не использую javascript в браузере, но изначально в рамках Titanium, это похоже на Javascript для Node.js.

16
задан Brett Ryan 24 February 2012 в 14:43
поделиться