在循环内的承诺后返回数组

时间:2018-07-16 15:55:22

标签: javascript typescript promise angular-promise

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

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;
    });

  }

1 个答案:

答案 0 :(得分:2)

首先,您应该返回Promise<DesktopPluginDefinitionImpl[]>,其次,如注释中所指出的,通过避免在.forEach()项中使用.push()可以大大简化方法的复杂性进入作用域数组。

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

  return Promise.all(pluginArray);
}

为了澄清,Promise<DesktopPluginDefinitionImpl>[]不是错字。 Promise.all()将一个promise数组转换为一个promise数组。