【问题标题】:Resolving multiple promise within a promise在一个 Promise 中解决多个 Promise
【发布时间】: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


【解决方案1】:

_.forEach 更改为.map(),并从回调中返回嵌套的promise。
这会给你一系列的承诺。

然后您可以将该数组传递给Promise.all() 以获得等待所有这些的承诺。

最后,您需要从您的承诺链中返回该承诺。

【讨论】:

  • 感谢大家的帮助。现在这对我来说很有意义。另外,我不经常在 Typescript 中编码,也没有跟上 ES6/ES7 的变化。给了我其他的工作,这很好。
猜你喜欢
  • 2023-03-31
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2020-10-06
相关资源
最近更新 更多