ES6(ES2015)是 JavaScript 的一个重要版本,在语言特性、模块化、函数等方面做了许多改进。其中,它对 Promise 的扩展是一个比较值得关注的方面。
Promise 简介
Promise 用于处理异步操作,它可以利用链式调用将多个异步操作串行执行。Promise 对象有三种状态:pending(进行中)、fulfilled(成功)和 rejected(失败)。
下面是一个简单的 Promise 使用示例:
-- -------------------- ---- ------- -------- --------- - ------ --- ----------------- ------- -- - --------------------------------- -------------- -- ---------------- ---------- -- -------------- ------------ -- --------------- --- - --------- ---------- -- ------------------ ------------ -- ----------------------
在上面的代码中,fetch
方法返回一个 Promise 对象,用 .then()
方法处理它的结果。如果成功,resolve
方法将 Promise 的状态改为 fulfilled(成功),并且把结果传给后续的 .then()
方法;如果失败,reject
方法将 Promise 的状态改为 rejected(失败),并且把错误原因传给后续的 .catch()
方法。
Promise.finally()
ES6 增加了 finally()
方法,用于指定不管 Promise 成功还是失败,都要执行的代码。这个方法没有参数,它返回一个 Promise 对象,它的状态和前一个 Promise 对象的状态一样。
下面是一个使用 finally()
方法的示例:
-- -------------------- ---- ------- -------- --------- - ------ --------------------------------- -------------- -- ----------------- - --------- ---------- -- ------------------ ------------ -- --------------------- ----------- -- ----------------------
在这个例子中,finally()
方法的作用是在 Promise 结束之后输出一条消息,表明 Promise 操作已经完成。
Promise.all()
ES6 还增加了 Promise.all()
方法,用于并行执行多个 Promise 对象,并在所有 Promise 对象都成功时返回一个 Promise 对象。如果其中一个 Promise 对象失败了,Promise.all()
方法返回的 Promise 对象也会失败,失败原因是第一个失败的 Promise 对象的失败原因。
下面是一个使用 Promise.all()
方法的示例:
-- -------------------- ---- ------- -------- ---------------- - ------ ------------- ------------------------------------------------ -- ----------------- ------------------------------------------------ -- ----------------- ------------------------------------------------ -- ---------------- --- - ---------------- -------------- ------ ------- -- ------------------ ------ ------- ------------ -- ----------------------
这个例子中,Promise.all()
方法用于并行请求三个数据源,并在所有数据源都成功返回数据时输出这些数据。如果其中一个数据源请求失败,它会把失败原因作为 catch()
方法的参数,输出错误信息。
Promise.race()
Promise.race()
方法和 Promise.all()
方法的作用相似,不同之处在于,它在所有 Promise 对象中有一个状态改变时就立即返回一个 Promise 对象,无论改变的状态是成功还是失败。它的参数和返回值与 Promise.all()
方法相似。
下面是一个使用 Promise.race()
方法的示例:
-- -------------------- ---- ------- -------- ---------------- - ------ -------------- ---------------------------------------------------- -- ----------------- ---------------------------------------------------- -- ---------------- --- - ---------------- ---------- -- ------------------ ------------ -- ----------------------
在这个例子中,Promise.race()
方法用于异步请求两个数据源,一个速度很慢,一个速度很快。它返回第一个返回数据的 Promise 对象,忽略其它Promise 对象的状态变化。
总结
ES6 引入了 Promise.finally()
、Promise.all()
和 Promise.race()
方法,使得处理异步操作变得更加方便。finally()
方法用于指定不管 Promise 成功还是失败,都要执行的代码;Promise.all()
方法用于并行执行多个 Promise 对象,并在所有对象都成功时返回一个 Promise 对象;Promise.race()
方法用于异步请求多个数据源,返回最先返回数据的 Promise 对象。这些方法的使用可以使前端的开发变得更加高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649a8fcd48841e9894778998