async和await

一、async函数返回值都是Promise对象

二、promise.then 成功的情况 对应await

三、promise.catch 失败的情况 对应try…catch

 

一、async函数返回值都是Promise对象

1、返回值不是promise对象,那么新promise的状态为fullfilled,结果为返回的结果,不写return默认是 return undefined

      async function test() {
        return 100
      }
      const result = test()
      console.log(result) // 状态为fullfilled,结果为100
      async function test() {}
      const result = test()
      console.log(result) // 状态为fullfilled,结果为undefined

2、返回值是promise对象,新promise的状态和结果为返回的状态和结果

      async function test() {
        return new Promise((res, rej) => {
          res(100)
        })
      }
      const result = test()
      console.log(result) // 状态为fullfilled,结果为100

同上:

      async function test() {
        return Promise.resolve(100)
      }
      const result = test()
      console.log(result) // 状态为fullfilled,结果为100
      async function test() {
        return Promise.reject()
      }
      const result = test()
      console.log(result) // 状态为rejected,结果为100

3、抛出异常,新promise的状态为rejected,结果为抛出的值

      async function test() {
        throw new Error('错误')
      }
      const result = test()
      console.log(result) // 状态为rejected,结果为Error: 错误

 

二、promise.then 成功的情况 对应await

1、await表达式后跟的是promise时,

  若promise状态为fullfilled:

      async function test() {
        const p = Promise.resolve(100)
        p.then((res) => {
          console.log(res) // 100
        })
        const res = await p
        console.log(res) // 100
        return res
      }
      const result = test()
      console.log(result) // 状态为fulfilled,结果为100,没有写return默认为return undefined

  若promise状态为rejected,需要用try…catch捕获:

      async function test() {
        const p = Promise.reject(100)
        try {
          const res = await p
          console.log(res)
        } catch (e) {
          console.log('err', e) // err 100
          return e
        }
      }
      const result = test()
      console.log(result) // 状态为fulfilled,结果为100

2、await后跟的是其他值,将该值作为await的返回值

      async function test() {
        const res = await 100 // 内部会封装成 await Promise.resolve(100)
        console.log(res)
        return res
      }
      const result = test()
      console.log(result) // 状态为fulfilled,结果为100

3、await后跟的是一个异步函数,将该函数的返回值作为await的返回值

      async function fn() {
        return 1
      }
      async function test() {
        const res = await fn()
        console.log(res)
        return res
      }
      const result = test()
      console.log(result) // 状态为fulfilled,结果为1

 

三、promise.catch 失败的情况 对应try…catch

      async function test() {
        const data = await Promise.reject(100)
        console.log(data)
      }
      const s = test() // Uncaught (in promise) 100
      console.log(s) // 未使用try...catch捕获,状态为rejected,结果为100

      async function test1() {
        try {
          const data = await Promise.reject(100)
          console.log(data)
        } catch (e) {
          console.log('err', e) // err 100
          return e
        }
      }
      const result = test1()
      console.log(result) // 状态为fullfilled,结果为100。catch中不写return默认是return undefined

 

上一篇:120. 三角形最小路径和


下一篇:四则运算生成器