【发布时间】:2018-01-24 00:07:57
【问题描述】:
我正在编写一个服务方法,它将返回一个从 API 获取对象的承诺。该对象与一组链接一起返回,以从 API 获取子对象。这里的关键是,在所有子对象都被检索并添加到父 MyType 之前,我不希望外部 Promise 解决。以下内容与我想要的很接近,但我不知道如何获得等待子对象在返回之前解决的承诺。
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);
});
});
【问题讨论】:
-
你已经有承诺了;你不应该打电话给
new Promise()。 -
本打算为您提供一个完成的代码解决方案,该解决方案使用
Promise.all()等待您的承诺循环,但我无法真正理解您正在尝试做什么的细节。当你用new Promise()包装内部承诺时,你也有一个反模式。你也不需要这样做。您可以只返回内部承诺以链接事物并使用Promise.all()等待多个承诺。 -
另外,为什么在 ES6 和 ES7 时代人们仍在使用
_.forEach(),这可能是迭代数组的最低效的方式。在这种情况下,您可能应该使用myType.childReferences.map()来累积一组子 Promise,这些子 Promise 可以传递给Promise.all(),然后从内部.then()处理程序返回。 -
@jfriend00 我猜
_.forEach(arr, …)仍然比arr.forEach(…)快 - 但是是的,map应该始终是首选。
标签: javascript angularjs typescript promise