2017-08-16 170 views
0

我正在編寫一個服務方法,它將返回一個承諾以從API獲取對象。該對象返回一組鏈接以便從API獲取子對象。這裏的關鍵是我不希望外部承諾解決,直到所有的子對象都被檢索並添加到父類MyType中。以下是關於我想要的內容,但我不知道如何獲得承諾,等待子對象在返回之前解決。解決承諾內的多重承諾

private getRegistrationDetailsPromise(url: string): Promise<MyType> {  
    return new Promise<MyType>((resolve) => { 
    return this.dataService.GetMyType(url) 
     .then((myType: MyType) => {      
      _.forEach(myType.childReferences, function(childUrl) { 
      let child = this.dataService.GetChild(childUrl).then((child) -> { 
       myType.children.push(child); 
      }; 
     };     
     return (x); 
    }); 
}); 
+2

你已經有承諾;你不應該調用'new Promise()'。 – SLaks

+0

想給你提供一個完成的代碼解決方案,它使用'Promise.all()'來等待你的承諾循環,但我無法真正理解你想要做什麼的細節。當你用'new Promise()'包裝內部承諾時,你也有反模式。你也不需要那樣做。您可以返回內部承諾來鏈接事物並使用'Promise.all()'等待多個承諾。 – jfriend00

+1

另外,爲什麼在ES6和ES7的時代,人們仍然在使用'_.forEach()'這是關於迭代數組的可能性最低的方法。在這種情況下,您應該使用myType.childReferences.map()來累積一個可以傳遞給Promise.all()然後從內部的.then()處理程序返回的子承諾數組。 – jfriend00

回答

2

變化_.forEach.map(),並返回從回調嵌套的承諾。
這會給你一個承諾的數組。

然後,您可以將該數組傳遞給Promise.all()以獲得等待所有這些數據的承諾。

最後,您需要從承諾鏈中返回承諾。

+0

謝謝大家的幫忙。這對我來說現在是有意義的。另外,我不經常在Typescript中編碼,也沒有跟上ES6/ES7的變化。給我一些其他的工作,這是很好的。 –