2017-09-08 167 views
0

我想用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/

enter image description here

+0

你忘了在你的dofollowup中返回你的延期承諾.. IOW:你創建了一個延期但從未返回它。 – Keith

回答

2

修改您的dofollowup返回推遲似乎解決這個問題。

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 deferred.promise; //you forgot this.. 
    }); 
    } 
    return to_do; 

} 
+0

是的,謝謝。這絕對是我小提琴問題的原因。這似乎很明顯,但不幸的是,現在它似乎並不模仿我的主要應用程序失敗。也許我忘了從這樣的鏈式函數中返回承諾。回到挖掘! –

相關問題