ES2018:异步 await 和 async 的实现方式详解

阅读时长 5 分钟读完

现今的 Web 应用已经成为了多数人每天必须使用的工具。而随着 Web 应用对于用户体验的要求不断提高,前端技术以惊人的速度发展着。其中,异步操作已经成为了现代 Web 应用开发不可或缺的一部分。而 ES2018 中的异步 await 和 async 又是如何实现的呢?本文将详细介绍这两个特性的实现方式,并提供代码示例和学习指导。

什么是异步 await 和 async?

异步操作是指在执行某个操作时,不需要等待该操作完成就可以继续执行下面的代码。在现代 Web 应用中,异步操作已经广泛应用于网络请求、文件读写、动画等多个方面。而异步操作常常难以处理回调嵌套、异常处理以及程序可读性的问题。异步 await 和 async 则是为了解决这些问题而出现的。

async 函数是异步操作的一个统一入口。async 函数返回一个 Promise 对象,async 函数可以在内部使用 await 关键字等待异步操作的完成,并返回一个异步操作完成后的值。异步操作出现异常时,async 函数会自动将异常转换成一个 rejected 的 Promise 对象,以方便进行后续处理。

下面是一个示例代码:

在上述代码中,getData 是一个 async 函数,使用 fetch 方法进行 http 请求,使用 await 关键字等待网络请求完成,并使用 JSON.parse 方法将数据解析成 JavaScript 对象后返回。无论该请求成功还是失败,调用 getData 方法的位置都可以通过 thencatch 方法获取该异步操作的结果或者错误信息。

异步 await 的实现方式

异步 await 的实现方式基于 Promise 的基础上,理解 Promise 的实现方式可以加深对于异步 await 的理解。

在 JavaScript 中,异步操作的执行首先会被转换成一个 Promise 对象,然后通过 Promise 对象进行回调处理。下面是一个 Promise 实现 Promise 进行异步操作的示例代码:

-- -------------------- ---- -------
--- ----------------- ------- -- -
  ------------- -- -
    ----- ------ - --------------
    -- ------- - ---- -
      ----------------
    - ---- -
      ---------- ------------ ------------
    -
  -- ------
--
------------ -- --------------------
------------ -- ----------------------
展开代码

在上述代码中,new Promise 创建了一个 Promise 对象,该 Promise 对象中的异步操作是一个延迟 1 秒的随机数生成。如果生成大于 0.5 的随机数,则 promise 的状态变成 resolved,通过 then 回调函数进行处理;否则状态变成 rejected,通过 catch 回调函数进行处理。

async 函数内部,可以通过 await 关键字等待一个返回 Promise 对象的异步操作完成,并获取该异步操作的返回值。下面是一个带有异步操作的 async 函数的示例代码:

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

--------------------- -- ---------------------
展开代码

在上述代码中,getData 函数通过 await 关键字等待一个返回 Promise 对象的异步操作完成后,再通过 return 返回异步操作的结果。调用 getData 的位置也可以通过 then 回调函数获取异步操作的结果。

异常处理

与常规的异步操作不同,使用 async 和 await 进行异步操作后,处理异常的方式有了明显的改善:

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

------------------- -- ------------------------------ -- ----------------------
展开代码

在上述代码中,使用 try/catch 进行异常处理。如果在异步操作中发生了遗产,会捕获到异常信息,并在 catch 块中进行处理。需要注意的是,catch 块中必须要进行异常的处理,否则异常会被“吞掉”而不会抛出。

综述

异步 await 和 async 是 ES2018 中的一种异步操作方式。async 函数是异步操作的一个统一入口,async 函数返回一个 Promise 对象。await 关键字可以等待一个返回 Promise 对象的异步操作完成,并获取该异步操作的返回值。使用 async 和 await 进行异步操作后可以方便的进行异常处理,并提高程序代码的可读性。

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

纠错
反馈

纠错反馈