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()返回值
将为您提供您想要的。是的,但我希望最终返回阵列。您需要返回阵列的承诺。