异步处理方案

目录

1.通过promise的链式调用将异步方法变为同步执行

2.使用async及await

3.回调函数方式

4.三种方式对比

 5.async及await使用的注意点


1.通过promise的链式调用将异步方法变为同步执行

function get1(){
  return new Promise((resolve,reject) =>{
    console.log('执行get1接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get1接口执行完成')
      }else{
        reject('get1接口执行失败')
      }
    },3000)

  })

}

function get2(){
  return new Promise((resolve,reject) =>{
    console.log('执行get2接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get2接口执行完成')
      }else{
        reject('get2接口执行失败')
      }
    },2000)

  })

}
function get3(){
  return new Promise((resolve,reject) =>{
    console.log('执行get3接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get3接口执行完成')
      }else{
        reject('get3接口执行失败')
      }
    },2000)

  })

}
function get4(){
  return new Promise((resolve,reject) =>{
    console.log('执行get4接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get4接口执行完成')
      }else{
        reject('get4接口执行失败')
      }
    },2000)

  })

}
// 进行get1-get4方法的顺序执行
get1()
.then(res=>{
  console.log(res);
  return get2()
})
.then(res=>{
  console.log(res);
  return get3()
})
.then(res=>{
  console.log(res);
  return get4()
})
.then(res=>{
  console.log(res);
})

执行结果:

异步处理方案_第1张图片

2.使用async及await

function get1(){
  return new Promise((resolve,reject) =>{
    console.log('执行get1接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get1接口执行完成')
      }else{
        reject('get1接口执行失败')
      }
    },3000)

  })

}

function get2(){
  return new Promise((resolve,reject) =>{
    console.log('执行get2接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get2接口执行完成')
      }else{
        reject('get2接口执行失败')
      }
    },2000)

  })

}
function get3(){
  return new Promise((resolve,reject) =>{
    console.log('执行get3接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get3接口执行完成')
      }else{
        reject('get3接口执行失败')
      }
    },2000)

  })

}
function get4(){
  return new Promise((resolve,reject) =>{
    console.log('执行get4接口逻辑')
    setTimeout(() =>{
      if(flag.value){
        resolve('get4接口执行完成')
      }else{
        reject('get4接口执行失败')
      }
    },2000)

  })

}

async function get(){
  //使用await可以让异步操作进行同步执行
 const result1 =  await get1();
 console.log(result1)
 const result2 =  await get2();
 console.log(result2)
 const result3 =  await get3();
 console.log(result3)
 const result4 =  await get4();
 console.log(result4)
}
get()

执行结果:

异步处理方案_第2张图片

await只能在async修改的异步函数中进行使用。 

3.回调函数方式

使用较少,多级回调导致函数难以理解。

4.三种方式对比

异步处理方案_第3张图片 

 5.async及await使用的注意点

①下面的示例中第一个任务执行完成之后才能执行第二个任务。

异步处理方案_第4张图片

更高效的做法是将所有的Promise用Promise.all组合起来,然后再去await,这样会提高运行效率,如下:

异步处理方案_第5张图片 ②在循环中执行异步操作,不能直接调用forEach及map方法,尽管在回调函数中写了await,这里的forEach会立即返回,不会暂停等到所有的异步操作都执行完成。如下:

异步处理方案_第6张图片

如果希望循环中的异步操作都一一执行完成之后才继续执行 ,可以使用传统的for循环,如下:

异步处理方案_第7张图片

 如果想要循环中的所有操作都并发执行,这里的for循环会等到所有的异步函数执行完成之后才执行后面的处理

异步处理方案_第8张图片

你可能感兴趣的:(前端,javascript,开发语言)