js forEach循环调用异步方法,如何实现同步

 

准备代码:

const res = []
const arr = [1,2,3,4,5]

function t(num) {
  return new Promise((resolve, reject) => {
    setTimeout(()=>{
      console.log('定时器', num)
      resolve()
    }, 1000)
  })
}

function t2(item){
  console.log('进入res')
  res.push(item)
}

 

情况1: forEach内部等待异步执行完成

arr.forEach(async (item, index) =>{
  await t(item)
  t2(item)
})

结果:  js forEach循环调用异步方法,如何实现同步_第1张图片

情况2: forEach外部等待forEach执行完成

let asyncFun = []
arr.forEach((item, index) =>{
  asyncFun.push(t(item))
  t2(item)
})
Promise.all(asyncFun).then(() => {
  console.log('res', res)
})

 结果:  js forEach循环调用异步方法,如何实现同步_第2张图片

情况3: 既需要forEach内部同步执行,又需要forEach外部同步执行

  • Promise.all(
      arr.map( item =>{
        return new Promise(async (resolve, reject) =>{
          await t(item)
          t2(item)
          resolve()
        })
      })
    ).then(() =>{
      console.log('object', res)
    })

    结果:js forEach循环调用异步方法,如何实现同步_第3张图片

  • 把外部代码移进来
arr.forEach(async (item, index) =>{
  await t(item)
  t2(item)
  if(index === arr.length-1){
    console.log('res', res)
  }
})

结果:js forEach循环调用异步方法,如何实现同步_第4张图片

 

你可能感兴趣的:(javascript,es6)