在 ES2018 中,Promise 得到了重要的增强,以提供更加强大和有用的功能。本文将深入探讨这些增强,以及如何正确地使用它们来提高 JavaScript 应用程序的可靠性和性能。
异步迭代
在 ES2018 中,Promise 可以被用作可异步迭代的对象,类似于数组和其他迭代器。异步迭代是指一个异步函数能够多次产生值,每次值的产生可能需要一些等待时间。
考虑如下示例代码:
-- -------------------- ---- ------- ----- ----------- - ----- --- -- - ----- -------- - ----- ----------- ----- ---- - ----- ---------------- ------ ----- -- ----- ---- - - -------------------- -------------------- ------------------- -- ----- ----------- - ----- -- -- - --- ----- ------ ---- -- ---------------------- - ------------------ - -- --------------
上述代码中,我们首先定义了一个异步函数 makeRequest,它接收一个 URL 并返回 JSON 数据。接着,我们定义了一个 URL 数组,然后定义了一个异步函数 requestData。此函数使用了 for-await-of 语法迭代 makeRequest 返回的 Promise 对象。每一个迭代步骤都必须等待前一个请求完成,因此我们可以确保顺序执行这些请求,而不会出现并发请求所带来的问题。
Promise.prototype.finally()
ES2018 还引入了 Promise.prototype.finally() 方法,该方法使用回调函数作为参数,该回调函数将在 Promise 被 resolved 或 rejected 时被执行。Promise.prototype.finally() 方法不接收任何参数,并返回原始 Promise。
考虑以下示例代码:
-- -------------------- ---- ------- ------------------------- -------------- -- - -------------------- ------------ ------ ---------------- -- ------------ -- - -------------------- --------- ------------------- -- ----------- -- - -------------------- ----------- ---
上述代码中,我们使用 fetch API 发送请求,并在处理响应的回调函数中使用了 Promise.prototype.finally() 方法来在请求完成后执行某些操作(例如清除加载指示器等)。不管该 Promise 是否被 resolved 或 rejected, .finally() 回调函数都将被执行。
Promise.allSettled()
ES2018 还引入了 Promise.allSettled() 方法,该方法会接收一个 Promise 数组,并返回一个新的 Promise 对象,该对象将在所有给定的 Promise 对象都被 settled(已解决或已拒绝)后被 resolved。
考虑以下示例代码:
-- -------------------- ---- ------- ----- -------- - - ---------------------------- ------------------------- ------------------------ ---------- -- ---------------------------- ------------- -- - ---------------------- -- - -- -------------- --- ------------ - -------------------------- - ---- - --------------------------- - -- ---
上述代码中,我们首先定义了一个包含成功和失败 Promise 的数组,然后使用 Promise.allSettled() 方法来返回一个新的 Promise 对象。在该对象被 resolved 时,将通过 forEach() 方法遍历结果数组,并根据成功或失败状态输出相应的数据。这样,我们可以在处理多个 Promise 时,确保处理成功和失败状态的数据,而不必使用 Promise.all() 方法一次性处理所有 Promise。
结论
ES2018 为 Promise 带来了强大的功能,让我们能够更好地利用 JavaScript 异步编程的优势。通过了解并正确使用上述新增功能,我们可以提高 JavaScript 应用程序的可靠性和性能,让程序开发和维护变得更加容易。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671f01f52e7021665efb1fa9