浅析await

136 阅读1分钟

什么是await

  1. await 可以和 promise 一起用
  2. await 可以使异步函数更像同步函数

async await的用法

我们可以写一个简单的promise函数

const 猜大小 = (x) => {
  return new Promise((resolve, reject)=>{
    setTimeout(()=>{
      const n = parseInt(Math.random(),10) + 1
      if( n < 3 ){
        if( x === '大'){
          reject(n)
        }else{
          resolve(n)
        }
      }
      if( n > 3 ){
        if( x === '大' ){
          resolve(n)
        }else{
          reject(n)
        }
      }
    },1000)
  })
}
  1. 使用then调用
猜大小('大')
  .then(
    (x)=>{console.log(x)},
    ()=>{console.log('err')}
    )
  1. 使用await
const test = async function (){
  try {
    let n = await 猜大小('大')
    console.log(n)
  }catch (err){
    console.log('err')
  }
}

test()

以上两种方法都可以调用Promise

  1. 使用await时,需要在函数前面写上async来表明它是一个异步函数
  2. 使用await时,后面需要接一个Promise,等Promise执行完毕后才会赋给n

使用await的好处

使用await的好处在于可以方便我们阅读代码 当我们仅仅调用一次then时,我们会觉得then更方便,但是当我们在then之后在多次调用then时,就出现问题了

Promise.then(f1,f2).then(f3,f4)

上面的代码表示

  1. f1 或者 f2 执行成功,调用f3
  2. f1 或者 f2 执行失败,调用f4

当我们再次then,就会发现事情变得复杂了。

Promise.then(f1,f2).then(f3,f4).then(f5,f6)

如果我们使用await,那么只会有 try catch 两个分支,阅读更方便。

有多个Promise时该怎么办

  1. 使用Promise.all / promise.race 配合 then
  2. 使用Promise.all / promise.race 配合 await 上面说了,await后面需要接一个Promise,那么Promise.all就符合条件了
const test = async function (){
  try {
    let n = await Promise.all([f1,f2])
    console.log(n)
  }catch (err){
    console.log('err')
  }
}

test()