javascript/nodejs -Map数组方法中while循环内的异步代码

o75abkj4  于 2023-03-08  发布在  Node.js
关注(0)|答案(2)|浏览(234)

我正在执行下面的代码块。对于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. 1、3、主要
  2. 1、3、睡眠时间:3000毫秒
  3. 1、2、主要
  4. 1、2、睡眠时间:2000毫秒
  5. 1,1个主要
  6. 1,1睡眠时间:1000毫秒
    1.二、三
  7. 2、3、主要
  8. 2、3、睡眠时间:3000毫秒
  9. 2、2、主要
  10. 2,2,睡眠时间:2000毫秒
  11. 2,1个主要
  12. 2,1睡眠时间:1000毫秒
    但是我没有得到这个输出。我想我得到的两个循环的输出是并行运行的。有人能建议如何调整程序以获得所需的输出吗?提前感谢我们的团队@realpensive。
    我试过用"等待承诺" Package Map,但似乎一点用都没有。
qq24tv8q

qq24tv8q1#

Array.map函数是同步处理迭代的,但是在每次迭代中引入了一个承诺,承诺调用中的内容是异步执行的,而随后的迭代可能已经被调用了,所以这正是你所说的,并行(在某种程度上),下面是你需要的输出,因为for循环实际上是等待承诺的。

for (const el of a) {   
  let i = 3
  console.log(el,i)
  while(i>0) {
    console.log(el, i, 'main')
    console.log(el, i, await sleep(i))
    i -= 1
  }
}
oyxsuwqo

oyxsuwqo2#

这是因为map本质上是同步的,而它接收的回调是异步的。map()使用array a元素以更快的速度调用回调,但cb由于时差而无法科普,它仍然在解决承诺,即等待&处于挂起状态。它在一些延迟后得到解决。
正如Sam所回答的,如果用任何其他非同步方法的循环可迭代方法替换map方法,它将提供所需的输出。

相关问题