2013-01-05 140 views
7

我是從這樣的函數返回一個承諾:等到承諾和嵌套thens完成

resultPromise = dgps.utils.save(opportunity, '/api/Opportunity/Save', opportunity.dirtyFlag).then(function() { 

       self.checklist.saveChecklist(opportunity).then(function() { 

        self.competitor.save(opportunity.selectedCompetitor()).then(function ... etc. 
return resultPromise; 

比方說,上面的函數被調用保存。

在調用函數中,我想等待整個鏈完成,然後執行一些操作。我的代碼有看起來像這樣:

var savePromise = self.save(); 
savePromise.then(function() { 
    console.log('aftersave'); 
}); 

結果是「aftersave」是發送到控制檯,而承諾的鏈條仍在運行。

整個鏈條完成後,我該怎麼做?

回答

7

而不是嵌套承諾,鏈接它們。

resultPromise = dgps.utils.save(opportunity, '/api/Opportunity/Save', opportunity.dirtyFlag).then(function() { 

        return self.checklist.saveChecklist(opportunity); 
       }).then(function() { 

        return self.competitor.save(opportunity.selectedCompetitor()); 
       }).then(function() { 
        // etc 
       }); 

// return a promise which completes when the entire chain completes 
return resultPromise; 
+2

如果那裏有條件,該怎麼辦?你不需要延期物品嗎? – FlavorScape

+0

這不是問題的答案。問題是如何等待鏈條結束。簡單地將更多元素添加到鏈中並不是一種解決方案,並且通常無法正常工作。 – MeanEYE

+0

@MeanEYE您等待 t鏈上的結束通過在鏈上執行'then'來完成。這解決了這個問題(儘管正如你所指出的那樣,它並不回答字面問題,但問題實際上是關於一個問題)。 –