关于forEach里的异步?

以下这段代码为何先输出222,后输出111,如果想让111先输出应如何修改?

  this.items.forEach(async el => {

await ApiHelper.post(`/mainData/selectDateByCd/${el.cd}`)

.then(response => {

console.log("111");

if (response.data.length > 0) {

this.flag = true;

}

})

.catch(err => {

err;

});

})

console.log(222);

关于forEach里的异步?


回答:

MDN有这么一段话关于forEach里的异步?
要解决可以使用forfor...offor await...of


回答:

在外包裹一层 Promise,可以确保执行顺序。

这种情况下,解决方案不唯一,我偏向于 Promise.all() + Array.map() 配合使用。

(async () => {

await Promise.all(

[10, 20, 30].map((el) => {

return new Promise((resolve) => {

setTimeout(() => {

// console.log("111");

console.log(el);

resolve(el);

}, 100 * el);

});

})

);

console.log(222);

})();


回答:

不如在外面加个 Promise

let  Promise = new Promise((res,rej)=>{

this.items.forEach(async el => {

await ApiHelper.post(`/mainData/selectDateByCd/${el.cd}`)

.then(response => {

console.log("111");

res(1)

if (response.data.length > 0) {

this.flag = true;

}

})

.catch(err => {

err;

});

})

})

Promise.then(()=>{

console.log(222);

})


回答:

使用promise.all:

async function processData() {

const promises = this.items.map(el => {

return ApiHelper.post(`/mainData/selectDateByCd/${el.cd}`)

.then(response => {

console.log("111");

if (response.data.length > 0) {

this.flag = true;

}

})

.catch(err => {

err;

});

});

await Promise.all(promises);

console.log(222);

}

processData();

或者使用for of

async function processData() {

const promises = this.items.map(el => {

return ApiHelper.post(`/mainData/selectDateByCd/${el.cd}`)

.then(response => {

console.log("111");

if (response.data.length > 0) {

this.flag = true;

}

})

.catch(err => {

err;

});

});

await Promise.all(promises);

console.log(222);

}

processData();


回答:

直接用 for ... of 就好,何必要去折腾 forEach()。另外,既然已经用了 await,就不需要再用 then 了。

for (const el of this.items) {

try {

const response = await ApiHelper.post(`/mainData/selectDateByCd/${el.cd}`);

console.log("111");

if (response.data.length > 0) {

this.flag = true;

}

} catch (err) {

console.log(err);

}

}

如果不想用 try...catch,用 .catch() 来处理错误也可以。把有错误的用 catch() 处理掉之后,返回个正常值出来(没返回就是 undefined,注意在取到 response 值的时候进行区分处理,下面的代码是用 ?. 来处理的)

for (const el of this.items) {

const response = await ApiHelper.post(`/mainData/selectDateByCd/${el.cd}`)

.catch(err => {

console.log(err);

// return undefined;

});

if (response?.data.length > 0) {

this.flag = true;

}

}

以上是 关于forEach里的异步? 的全部内容, 来源链接: utcz.com/p/935259.html

回到顶部