我有一个ForEach循环,我在其中调用异步函数。使用计数器,我可以弄清楚我的数组中的所有项目何时被处理,但我想知道的是如何在处理完所有项目后将我的Promise返回到已解决的状态?
public doAsyncThingsToArray(array: number[]): Promise<void>
let count: number;
array.forEach((item) => {
this.doAsynchStuff(item)
})
.then(() => {
count++;
if (count == item.length) {
//Probably something has to be done here
}
});
我希望能够像这样调用我的函数doAsyncThingsToArray
:
doAsyncThingsToArray(myArray)
.then(() => {
//all my array has been processed
})
谢谢!
编辑:
以下代码
public doAsyncThingsToArray(array: number[]): Promise<void> {
Promise.all(
array.map((item) => {
return this.doAsynchStuff(item)
.then(() => {
console.log("item processed");
return Promise.resolve();
})
})
)
.then(() => {
console.log("All item are processed");
return Promise.resolve();
});
答案 0 :(得分:1)
这就是Array#map()
和Promise.all()
存在的原因。当您需要引用每个数组项的承诺时,请不要使用Array#forEach()
。 doAsyncThingsToArray()
的正文应如下所示:
return Promise.all(array.map((item) => this.doAsyncStuff(item))
this.doAsyncStuff()
返回承诺的地方。