美文网首页
ES6:Async / Await

ES6:Async / Await

作者: HIKALU | 来源:发表于2021-08-11 23:33 被阅读0次

    async 不一定是异步的

    虽然 async 这个词本身表示异步(asynchronous的缩写),但 async 函数本身并不是异步的。是的,你没有看错,这个顶着异步名号的家伙,其实是个同步函数,真正的“异步”在它的肚子里。如果 async 函数的函数体里执行的全都是同步操作,那么它就和普通的函数没什么区别,只有当其中执行到异步的操作的时候,配合 await 才会发挥出真正的威力。

    const asyncFunc = async () => {
      console.log('called')
      const result = await Promise.resolve('async')
      console.log(result)
    }
    
    asyncFunc()
      .then(res => console.log('then'))
      .catch(err => console.log(err))
    
    console.log('sync')
    
    • 在函数定义的最前面添加 async 表示这是个 async 函数。
    • awiat 只能在 async 函数内部使用。
    • async 函数本身是同步的,所以 "called" 会先打出来;直到遇到第一个 await ,函数先返回,后面的流程全都视为异步。所以 "async" 会在 "sync" 之后打出。
    • await 后面通常接一个异步操作,待执行完成后返回结果,再往下执行。当然 await 后面也可以接一些原始类型,此时这就相当于是一个同步操作。但这并不影响 async 函数会在这之前先返回。
    • async 函数的调用和普通函数一样。
    • async 函数总是返回一个 Promise,如果函数内 return 语句返回的不是 Promise,则会被包装秤一个立即 resolve 的 Promise对象。
    • async 函数在遇到第一个 awiat 时会先返回一次,交还程序的控制权给到父级,函数内的后续流程会继续异步执行,直到完成或出错,才正式返回一个 Promise。

    async 函数的错误处理

    async 函数的错误处理机制其实和 Promise 差不多,只不过一些细节上需要留意一下。

    async 函数里如果出现有 Promise 被 reject 的情况,无论代码中是否有 return ,函数会立即返回一个被 reject 的 Promise,后续代码不会执行。如果希望异步操作出错不影响后续的逻辑,可以把异步操作嵌套在 try...catch 里,如果异步操作本身就是 Promise,也可以用 Promise 的 catch() 来处理。

    相关文章

      网友评论

          本文标题:ES6:Async / Await

          本文链接:https://www.haomeiwen.com/subject/qprkbltx.html