Я пытаюсь найти лучший способ создания асинхронных вызовов, когда каждый вызов зависит от предыдущего вызова, который должен быть завершен. В настоящий момент я цепляю методы, рекурсивно вызывая определенную функцию процесса, как показано ниже.
Это то, что я сейчас делаю.
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.