2017-08-16 169 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的变化。给我一些其他的工作,这是很好的。 –