解析 ECMAScript 2017 (ES8) 中的 async 和 await 关键字

阅读时长 5 分钟读完

前言:在讨论 async 和 await 关键字之前,我们需要先掌握 promise 的基础知识。

Promise 概述

Promise 是一种异步编程的解决方案,目的是在异步操作成功和失败的时候,在合适的时间通知程序进一步如何处理。Promise 可以分为 3 个状态:pending(进行中)、resolved(已完成)、rejected(已拒绝)。

async 和 await

async 和 await 是 ECMAScript 2017 新增的异步编程关键字,它们可以显著地改进异步编程的体验和性能。

async

async 关键字用来声明一个异步函数。异步函数会返回一个 Promise 对象,可以在函数内部使用 await 关键字来等待一个 Promise 对象的状态变更。

解析:

  1. 定义了一个名为 fetchData 的异步函数
  2. 使用 await 等待 fetch 请求返回结果
  3. 使用 await 将结果解析为 json 格式的数据
  4. 返回结果数据

await

await 关键字用来等待一个 Promise 对象的状态变更。当执行到 await 关键字的位置时,函数会暂停执行,直到所等待的 Promise 对象状态变成 resolved 或者 rejected。

使用 await 关键字需要注意以下两点:

  1. await 关键字只能在异步函数中使用
  2. await 关键字必须和 Promise 对象一起使用
-- -------------------- ---- -------
----- -------- ----------- -
  --- -
    --- ------ - ----- --------------------------------------
    --- ---- - ----- --------------
    ------ -----
  - ----- ----- -
    -------------------
  -
-

解析:

  1. fetchData 中使用了 try…catch 语句块来捕获错误
  2. fetch 请求和 result.json() 方法都使用了 await 等待异步操作的返回结果
  3. 如果错误发生,catch 语句块可以捕获到错误并输出到控制台

总结

async 和 await 关键字让异步编程更加直观、易懂,同时也避免了回调地狱和复杂的 Promise 链式调用。

回顾 fetchData 函数,它使用 async 关键字声明为异步函数,并且在其中使用了 await 等待异步操作的返回结果。整个函数的返回值是一个 Promise 对象。

async 和 await 的核心就是让我们可以像编写同步代码一样编写异步操作,从而让代码更加简洁易懂。

示例代码

这里提供一个基于 async 和 await 的计时器示例。

-- -------------------- ---- -------
-- -- ------- ----
-------- --------- -
  ------ --- --------------- -- ------------------- -----
-

----- -------- ------- -
  --- ---- - - -- - -- -- ---- -
    ----------------- ---------
    ----- ------------
  -

  --------------------
  -- -------------
  --- ------ - ----- -----------------------------------------
  --- ---- - ----- --------------
  ------------------------------------
-

--------

解析:

  1. 定义了一个基于 Promise 的 sleep 函数,用来模拟等待一段时间。
  2. 使用 async 关键字声明了一个异步函数 timer。
  3. 在异步函数中设置一个倒计时,每隔 1 秒输出倒计时信息。
  4. 在倒计时结束后,调用抽奖接口,并使用 await 关键字等待抽奖结果返回。
  5. 输出抽奖结果。

输出:

经过这个实例,希望开发者们已经能够快速掌握 async 和 await 关键字的应用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d447bfb5eee0b525bcc813

纠错
反馈