【发布时间】:2021-07-15 23:57:20
【问题描述】:
您好,我正在更深入地研究 Javascript async/await,但我有一些我不理解的代码。
在这段代码中,我首先将一个数组 [1,2,3,4] 发送到一个名为 timeCall 的函数,然后再次将它与 [5,6,7,8] 一起发送。所以,我希望代码工作的方式是
1 2 3 4
h e l l o
5 6 7 8
h e l l o
是啊,为什么
1 5
h e l l o
2 6
h e l l o
我不确定这是否是这样处理的。如果我使用map而不是for of语句,1到8完成后,hello重复出现。我想现在,当我遇到等待时,我继续进行微任务并发送下面的 5 6 7 8。我觉得没什么问题
1 2 3 4 你好 5 6 7 8 ....
如何修改代码以输出这样的数据?
const timeArrs = [
'h',
'e',
'l',
'l',
'o'
]
function time(arr) {
return new Promise((res, rej) => {
setTimeout(() => {
res(console.log(arr));
}, 3000);
})
}
function timeArrProcessing(arr) {
return new Promise((res, rej) => {
setTimeout(() => {
res(console.log(arr));
}, 2000);
})
}
function hi() {
return Promise.all(timeArrs.map(async(arr) => {
await timeArrProcessing(arr);
}));
}
async function timeCall(arrs) {
for(const arr of arrs) {
await time(arr);
await hi();
}
console.log('End');
}
timeCall([1, 2, 3, 4]);
timeCall([5, 6, 7, 8]);
【问题讨论】:
-
timeCall调用中没有await,这就是它们“并行”运行的原因 -
@GuerricP,timeCall 在顶层。考虑
timeCall([1, 2, 3, 4]).then(() => timeCall([5, 6, 7, 8])); -
然后用
then链接它们或将它们封装在asyncIIFE中 -
除了不等待
timeCall的主要问题之外,这段代码令人困惑。timeArrs.map(async(arr) =>...arr不是一个数组,而是一个字符。变量的名称不是很有启发性。您的代码输出“结束”,这不在您想要的输出中。hi()在每个数组元素输出后被调用,但你不希望这样......
标签: javascript async-await es6-promise