问题描述
const works = [
{ name: "CCS",workStatus: { isComplete: true } },{ name: "CCB",workStatus: { isComplete: false } },{ name: "CCF",];
works.forEach(function (item) {
setTimeout(function(){
if (item.name === "CCF") {
item.workStatus.isComplete = true;
}
},3000);
});
console.log("works",works);
如果每个 forEach 循环执行至少需要 3 秒......
如何记录已被 forEach 循环修改的最终作品? (使用承诺)
当前控制台只会记录旧作品,如何在此处记录修改过的作品?
解决方法
例如,您可以创建一个方法来修改您的项目并在完成后进行解析。然后使用 Promise.all()
等待所有修改完成。 Promise.all
解析后,打印出修改后的数组...
const works = [
{ name: "CCS",workStatus: { isComplete: true } },{ name: "CCB",workStatus: { isComplete: false } },{ name: "CCF",];
function m(item) {
return new Promise(res => {
setTimeout(() => {
if (item.name === "CCF")
item.workStatus.isComplete = true;
res();
},3000);
});
}
Promise.all(works.map(x => m(x)))
.then(_ => console.log(works));
但是由于所有item都使用同一种方法似乎不太合理,因为每个item可能有不同的修改,你可以事先检查一下,对需要修改的item调用修饰符即可>
const works = [
{ name: "CCS",];
function m(item) {
return new Promise(res => {
setTimeout(() => {
item.workStatus.isComplete = true;
res();
},3000);
});
}
let p = [];
works.forEach(x => {
if (x.name === "CCF") p.push(m(x));
});
Promise.all(p)
.then(_ => console.log(works));