Estoy tratando de encontrar la mejor manera de crear llamadas asincrónicas cuando cada llamada depende de la llamada anterior para haber completado. En este momento estoy encadenando los métodos recursivamente llamando a una función de proceso definida como se ilustra a continuación.¿Cuál es la forma correcta de encadenar llamadas asíncronas en javascript?
Esto es lo que estoy haciendo actualmente.
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();
}
}
})();
me permitiría llamar a esto de la siguiente manera
var log = function(message) {
// Impl removed.
}
syncProduct.start(function() {
log("Product Sync Complete!");
}, log);
Aunque esto funciona perfectamente bien para mí No puedo evitar pensar que tiene que haber una manera mejor (más simple). ¿Qué sucede más tarde cuando mis llamadas recursivas se vuelven demasiado profundas?
NOTA: No estoy usando javascript en el navegador pero de forma nativa en el marco de Titanium, esto es similar a Javascript para Node.js.
¿Has visto "promesas"? Pueden encajar bien. [Esta es una biblioteca que lo implementa para Nodo] (https://github.com/kriskowal/q). – pimvdb
Esa biblioteca se ve brillante pimvdb, creo que voy a usar esta. –