我試圖找到最好的方式來創建異步調用時,每個電話取決於先前的呼叫已完成。目前我通過遞歸調用定義的過程函數來鏈接方法,如下所示。在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,但本機在鈦框架內,這是類似於Node.js的Javascript。
你看過「承諾」嗎?他們可能很好。 [這是一個爲Node實現的庫](https://github.com/kriskowal/q)。 – pimvdb 2012-02-24 14:46:43
那個庫看起來很棒pimvdb,我想我會用這個。 – 2012-02-25 06:37:35