Próbuję znaleźć najlepszy sposób tworzenia połączeń asynchronicznych, gdy każde połączenie zależy od wcześniejszego połączenia. W tej chwili używam metod, wywołując rekurencyjnie zdefiniowaną funkcję procesu, jak pokazano poniżej.Jaki jest poprawny sposób połączenia połączeń asynchronicznych w javascript?
Właśnie to robię.
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();
}
}
})();
bym wtedy nazywamy to następująco
var log = function(message) {
// Impl removed.
}
syncProduct.start(function() {
log("Product Sync Complete!");
}, log);
Chociaż to działa perfekcyjnie dla mnie nie mogę pomóc, ale myślę, że musi być lepszy (prostszy) sposób. Co stanie się później, gdy moje rekurencyjne połączenia będą zbyt głębokie?
UWAGA: Nie używam javascript w przeglądarce, ale natywnie w ramach Titanium, jest to podobne do Javascriptu dla Node.js.
Czy spojrzał na „obietnic”? Mogą pasować fajnie. [To jest biblioteka implementująca go dla Węzła] (https://github.com/kriskowal/q). – pimvdb
Ta biblioteka wygląda genialnie pimvdb, myślę, że będę używał tego. –