【问题标题】:returning array after promises within loop在循环内承诺后返回数组
【发布时间】:2018-12-24 05:39:02
【问题描述】:

我正在尝试在运行循环并每次调用承诺后汇总响应。但是,该函数不会等待所有的 Promise 完成并返回 undefined。

getAllPluginImpls(): DesktopPluginDefinitionImpl[] {
    let pluginArray: DesktopPluginDefinitionImpl[] = [];
    let promises = [];
    Array.from(this.pluginMap.keys()).forEach(id =>
      promises.push(this.pluginManager.findPluginDefinition(id).then(
        def => {
          console.log("id");
          console.log(id);
          console.log("def");
          console.log(def);
          let pluginImpl = def as DesktopPluginDefinitionImpl;
          pluginArray.push(pluginImpl);
        }
      )
    )
    );
    Promise.all(promises).then(s => {
      console.log("end reached :(");
      console.log(pluginArray);
      return pluginArray;
    });

  }

【问题讨论】:

  • 你需要兑现你的承诺。
  • 使用 .map(),而不是 .forEach()
  • 不要推送到数组,而是从你的承诺中返回值,Promise.all() 会给你你想要的。
  • 是的,但我想最终返回数组
  • 你需要返回一个数组的promise。

标签: javascript typescript promise angular-promise


【解决方案1】:

首先,您应该返回 Promise<DesktopPluginDefinitionImpl[]>,其次,正如 cmets 中所指出的,通过避免在作用域数组中使用 .forEach().push() 条目,您的方法的复杂性将大大简化。

getAllPluginImpls(): Promise<DesktopPluginDefinitionImpl[]> {
  const pluginArray: Promise<DesktopPluginDefinitionImpl>[] = Array.from(
    this.pluginMap.keys(),
    id => this.pluginManager.findPluginDefinition(id)
  );

  return Promise.all(pluginArray);
}

澄清一下,Promise&lt;DesktopPluginDefinitionImpl&gt;[] 不是错字。 Promise.all() 将一个 Promise 数组转换为一个 Promise 数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多