我正在尝试在运行循环并每次都承诺被调用后汇总响应。但是,该函数不会等待所有的诺言都完成并返回未定义。
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;
});
}
答案 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数组。