代码如下:
function longTimeDo() {
let data = [];
let sourse = [1,2,3,4,5];
sourse.forEach(value=>{
setTimeout(()=>{
data.push(value);
},1000);
});
//?怎么返回这个异步完成的data
}
代码如下:
function longTimeDo() {
let data = [];
let sourse = [1,2,3,4,5];
sourse.forEach(value=>{
setTimeout(()=>{
data.push(value);
},1000);
});
//?怎么返回这个异步完成的data
}
这样是不行的哦:
function longTimeDo() {
let data = [];
let sourse = [1,2,3,4,5];
sourse.forEach(value => {
console.log('forEach-star')
setTimeout(() => {
data.push(value);
console.log('forEach-async')
}, 1000);
console.log('forEach-end')
});
console.log('longTimeDo-end');
}
longTimeDo();
输出结果为
从结果可以看到, 在循环中的异步只是会在循环中作用, 而不能影响循环外部. 如果你想让这个函数返回 异步后的结果的话 就相当于异步改同步, 就要用到Primise了
async function longTimeDo () {
let data = [];
let sourse = [1,2,3,4,5];
let allP = sourse.map(value => {
return new Promise((res, rej) => {
setTimeout(() => {
data.push(value+1);
res(data)
}, 1000);
});
});
await Promise.all(allP);
return data;
}
longTimeDo().then(res => {
log(res) // [2, 3, 4, 5, 6]
})
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
你可以用
Promise.all
或者for of
加async/await
。