ECMAScrpt 2018:异步生成器、Promise.prototype.finally() 和 Rest/Spread 操作符

ECMAScript 2018(简称 ES2018)是 JavaScript 的最新版本,其中推出了一些新的功能和特性,本文将重点介绍异步生成器、Promise.prototype.finally() 和 Rest/Spread 操作符。

异步生成器

异步生成器是 ES2018 中的一个新特性,它允许我们在生成器函数中使用异步操作。换句话说,异步生成器可以返回异步迭代器。

在异步生成器中,我们可以使用 yield 关键字来暂停迭代并返回一个 Promise 对象。在异步操作完成后,我们可以使用 await 关键字来恢复迭代。下面是一个简单的例子:

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

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

在上面的例子中,asyncGenerator() 函数返回了一个异步迭代器。在 for await 循环中,我们可以使用 await 关键字来等待异步生成器返回的 Promise 对象,并使用 yield 暂停迭代。当异步操作完成后,我们可以使用 await 关键字来恢复迭代。

Promise.prototype.finally()

在早期版本的 JavaScript 中,我们经常需要在 Promise 中添加 finally 回调,以确保在 Promise 完成后始终执行一些操作。

ES2018 中,Promise 对象已经添加了 finally 方法。该方法接受一个回调函数作为参数,无论 Promise 成功还是失败,该回调函数都会被执行。

下面是一个示例代码:

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

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

在上面的代码中,我们使用 Promise.resolve()Promise.reject() 创建了两个 Promise 对象。在第一个 Promise 中,我们使用 then 方法来输出 Promise 的返回值,并使用 finally 方法来输出字符串。在第二个 Promise 中,我们使用 catch 方法来输出 Promise 的错误信息,并使用 finally 方法来输出字符串。

Rest/Spread 操作符

在 ES6 中,我们已经学习了 Rest 和 Spread 操作符,它们可以让我们轻松地操作数组和对象。在 ES2018 中,Rest/Spread 操作符已经添加了对对象字面量的支持。

下面是一个简单的例子:

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

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

在上面的代码中,我们使用 ... 操作符将一个对象解构为一个对象字面量,在后面添加一个新的键值对。我们还可以使用 ... 操作符将多个对象字面量合并为一个对象字面量。

总结

在本文中,我们了解了 ES2018 中的三个新特性: 异步生成器、Promise.prototype.finally() 和 Rest/Spread 操作符,并给出了相应的示例代码。学习这些新特性可以让我们在编写 JavaScript 时更加灵活和高效。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6650a83bd3423812e435ee81