我正在执行下面的代码块。对于jsfidle行,单击here
async function sleep(time = 1) {
const sleepMilliseconds = time * 1000
return new Promise(resolve => {
setTimeout(() => {
resolve(`Slept for: ${sleepMilliseconds}ms`)
}, sleepMilliseconds)
})
}
async function main() {
let a = [1,2]
a.map(async(el)=>{
let i = 3
console.log(el,i)
while(i>0) {
console.log(el, i, 'main')
console.log(el, i, await sleep(i))
i -= 1
}
})
}
main()
理想的序列输出为:-
1.一、三
- 1、3、主要
- 1、3、睡眠时间:3000毫秒
- 1、2、主要
- 1、2、睡眠时间:2000毫秒
- 1,1个主要
- 1,1睡眠时间:1000毫秒
1.二、三 - 2、3、主要
- 2、3、睡眠时间:3000毫秒
- 2、2、主要
- 2,2,睡眠时间:2000毫秒
- 2,1个主要
- 2,1睡眠时间:1000毫秒
但是我没有得到这个输出。我想我得到的两个循环的输出是并行运行的。有人能建议如何调整程序以获得所需的输出吗?提前感谢我们的团队@realpensive。
我试过用"等待承诺" Package Map,但似乎一点用都没有。
2条答案
按热度按时间qq24tv8q1#
Array.map
函数是同步处理迭代的,但是在每次迭代中引入了一个承诺,承诺调用中的内容是异步执行的,而随后的迭代可能已经被调用了,所以这正是你所说的,并行(在某种程度上),下面是你需要的输出,因为for循环实际上是等待承诺的。oyxsuwqo2#
这是因为map本质上是同步的,而它接收的回调是异步的。map()使用
array a
元素以更快的速度调用回调,但cb由于时差而无法科普,它仍然在解决承诺,即等待&处于挂起状态。它在一些延迟后得到解决。正如Sam所回答的,如果用任何其他非同步方法的循环可迭代方法替换map方法,它将提供所需的输出。