我想用q承諾來處理一些長期運行的ajax請求和後續的數據處理。我有一個案例,我試圖創建一些應該按順序執行的承諾,但他們似乎在我想要他們之前解決,我不知道爲什麼。我的承諾正在解決之前,我認爲它應該
主要的順序是首先嚐試一些應該異步完成的「主」工作,然後做一些「後續」工作,它本身包含一系列的異步請求。下面是從我的小提琴主體,其演示的問題:
var to_do = ["one", "two", "three", "four"];
var result = Q();
to_do.forEach(function (item) {
result = result
.then(dowork.bind(null, item))
.fail(handleError)
.then(dofollowup.bind(null, item));
});
var dowork = function (value) {
var deferred = Q.defer();
log("About to do main work for " + value);
setTimeout(function() {
if (value === 'two') {
// represent a possible error in this work, but we still need to do follow-up work
deferred.reject("An error occurred doing work for number two, but we should continue");
} else {
log("Done main work for " + value);
deferred.resolve(value);
}
}, 1000);
return deferred.promise;
}
var dofollowup = function (value) {
log("Doing follow-up work for " + value);
var to_do = Q();
for (var i=0; i<5; i++) {
to_do = to_do.then(function() {
var deferred = Q.defer();
setTimeout(function() {
log("Doing delayed work for " + value);
deferred.resolve();
}, 100);
});
}
return to_do;
}
我眼前的問題是,一個項目的「後續」工作完成之前,下一個項目的「主」的工作正在啓動。我猜測我只是沒有正確處理承諾,並意外地過早解決了這個問題,但我目前看不到。
我創建了一個模擬我的問題的小提琴。其中,我看到在「一」的後續工作完成之前開始「兩個」工作項目的工作。我如何確保在開始下一個主要工作之前完成每個項目的後續工作?
https://jsfiddle.net/cfarmerga/cp323djx/1/
你忘了在你的dofollowup中返回你的延期承諾.. IOW:你創建了一個延期但從未返回它。 – Keith