异步ajax请求之间可能会有依赖情况,本篇以定时器模拟请求,总结了几种通过async await和Promise将异步转为同步的方案

 

异步ajax请求之间可能会有依赖情况,本篇以定时器模拟请求,总结了几种通过async await和Promise将异步转为同步的方案

// get1请求、get2请求
function get1 () {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      num1 += 1
      console.log('get1执行')
      resolve(num1)
    }, 2000)
  })
}
function get2 () {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      num2 += 2
      console.log('get2执行')
      resolve(num2)
    }, 1000)
  })
}

1.异步请求,无依赖

get1 ()
get2 ()
// get2执行 get1执行

2.Promise.all():get3依赖get1和get2,get1和get2之间异步执行

Promise.all([get1(), get2()]).then((data) => {
  console.log(data)
})
// get2执行 get1执行 [1, 2]

then的函数体会在get1和get2的回调完成后执行,参数data是get1和get2的resolve()参数值组成的数组
3.get3依赖get1和get2,且get1和get2同步执行

方案1:async await:

async function get3 () {
  await get1()
  await get2()
  console.log(num1 + num2)
}
get3() // get1执行 get2执行 3

get3函数体会在get1和get2回调执行完执行
get1和get2同步执行,即get2会等get1回调执行后开始执行

方案2:Promise.all() await

async function get3 () {
  Promise.all([await get1(), await get2()]).then((data) => {
    console.log(data)
  })
}
get3() // get1执行 get2执行 [1, 2]

.get3依赖get1和get2,get1和get2有一个进入catch,阻塞get3

async function get3 () {
  let get1Flage = await get1().catch(() => {
    return false
  })
   if (!get1Flage) {
    return // 不再继续执行
  }
  let get2Flage = await get2().catch(() => {
    return false
  })
  if (!get2Flage ) {
    return // 不再继续执行
  }
  console.log(num1 + num2)
}

确保只有get1和get2都成功才会执行get3

 

来源:https://blog.csdn.net/qq_37246828/article/details/89478818

参考:https://www.jianshu.com/p/3457a7ab4afb

posted @ 2020-11-17 16:49  小小强学习网  阅读(25)  评论(0编辑  收藏