Async/Await Promise 详解

阅读时长 4 分钟读完

什么是 Promise?

Promise 是一种异步编程的解决方案,用来解决回调地狱的问题。在 Promise 的编程模型中,异步操作返回一个 Promise 对象,这个对象代表异步操作的结果。当异步操作结束时,Promise 对象的状态会发生改变,可以是 Fulfilled(操作成功)或 Rejected(操作失败)。

如何使用 Promise?

在 ECMAScript 6(ES6)中,Promise 是一个内置的全局对象。要创建一个 Promise 对象,可以使用 Promise 构造函数,它接收一个函数作为参数,这个函数就是所谓的执行器函数(executor function):

执行器函数接收两个函数作为参数:resolve 和 reject。当异步操作成功时,调用 resolve 函数,并将操作结果作为参数传递给它。当异步操作失败时,调用 reject 函数,并将错误信息作为参数传递给它。

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

在上面的例子中,异步操作使用 setTimeout 模拟,将在 1 秒钟后成功,并调用 resolve 函数返回结果。promise.then 方法用于注册当异步操作成功后要执行的回调函数并处理结果,第一个参数接收成功的结果,第二个参数接收失败的错误信息。

Async/Await 是什么?

Async/Await 是 ES2017 中引入的新语法(实际上是 Generator 和 Promise 许多特性的语法糖),它使得异步编程更加具有表现力和易读性。使用 Async/Await 可以让异步代码看起来像同步代码的写法,也就是在函数前使用 async 关键字,并在异步操作前使用 await 关键字。

在上面的例子中,async 关键字表示这个函数是异步的,await 关键字表示后面的表达式是一个 Promise 对象,等待 Promise 对象状态发生变化后再继续执行。

Async/Await Promise 结合使用

Asnyc/Await 和 Promise 是可以结合使用的,Async 函数返回的是一个 Promise 对象,而 Await 可以等待 Promise 对象状态的变化:

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

在上面的例子中,fetchData 函数返回一个 Promise 对象,并使用 await 等待 axios.get 返回一个 Promise 对象的状态。如果 Promise 状态变为 Fulfilled,await 返回 Promise 对象的结果值;如果 Promise 状态变为 Rejected,await 抛出 Promise 对象的错误对象。

Async/Await Promise 优缺点

优点

  1. 更易读:使用 Async/Await 可以让异步代码看起来像同步代码的写法,也就是可以消除回调地狱;
  2. 更易调试:采用 Async/Await 的方法可以让错误更加有意义,也更容易调试;
  3. 更容易控制异步顺序:使用 Async/Await 可以让开发人员更容易控制异步操作的顺序。

缺点

  1. 只能在异步函数内部使用:Async/Await 只能在异步函数内部使用,如果在普通函数内部使用,将会得到语法错误;
  2. 只是 Promise 的语法糖:Async/Await 只是 Generator 和 Promise 许多特性的语法糖,并不是一种新的异步编程解决方案;
  3. 老浏览器不支持:Async/Await 在老版本的浏览器中可能会出现兼容性问题。

结论

Promise 和 Async/Await 是异步编程的两种主流解决方案,都有优缺点,在实际开发中应根据具体情况选择合适的方案。如果条件允许,可以使用 Async/Await,因为它可以让异步代码看起来更加简洁和易读。

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

纠错
反馈