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