Javascript 在循环中的承诺后返回数组

Javascript 在循环中的承诺后返回数组,javascript,typescript,promise,angular-promise,Javascript,Typescript,Promise,Angular Promise,我试图在运行循环并每次都调用承诺之后聚合响应。但是,该函数不会等待完成所有承诺并返回未定义的结果 getAllPluginImpls(): DesktopPluginDefinitionImpl[] { let pluginArray: DesktopPluginDefinitionImpl[] = []; let promises = []; Array.from(this.pluginMap.keys()).forEach(id => 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;
    });

  }

首先,您应该返回
Promise
,其次,正如注释中所指出的,通过避免将
.forEach()
项用于
.push()
项,可以大大简化方法的复杂性

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

  return Promise.all(pluginArray);
}
getAllPluginImpls():承诺{
const pluginArray:Promise[]=Array.from(
this.pluginMap.keys(),
id=>this.pluginManager.findPluginDefinition(id)
);
返回承诺。全部(pluginArray);
}

要澄清的是,
Promise[]
不是打字错误
Promise.all()
将承诺数组转换为数组的承诺。

您需要返回您的承诺。使用。
map()
,而不是
。forEach()
而不是推送到数组,从承诺和
Promise.all()返回值
将为您提供您想要的。是的,但我希望最终返回阵列。您需要返回阵列的承诺。