在JavaScript开发中,处理异步操作是必不可少的。传统的回调函数方式已经无法满足复杂的异步操作需求,而Promise则成为了一种更加优雅的异步编程解决方案。
Promise简介
Promise是ES6引入的一种异步编程解决方案,本质上是一个对象,用于表达一个异步操作的最终完成状态(成功或失败)及其结果值。
Promise有3个状态:
pending
:初始状态,既不是成功,也不是失败状态。fulfilled
:代表操作成功完成,此时会执行then
方法指定的回调函数。rejected
:代表操作失败,此时会执行catch
方法指定的回调函数。
Promise基本用法
创建Promise对象
创建Promise对象需要传入一个executor函数,该函数接收两个参数,分别是resolve和reject函数。当异步操作成功时,调用resolve函数并传入异步操作结果;当异步操作失败时,调用reject函数并传入错误对象。
以下是一个简单的Promise示例:
----- ------- - --- ----------------- ------- -- - ------------- -- - -------------- --------- -- ------ ---
上述代码创建了一个Promise对象,1秒钟后返回字符串"Hello World!"。
使用Promise
使用Promise对象可以通过then
、catch
和finally
方法来处理异步操作的结果。
------------------- -- - -------------------- -- -------- ------ -------------- -- - --------------------- ---
上述代码中,then
方法用于指定异步操作成功时的回调函数,catch
方法用于指定异步操作失败时的回调函数。
如果不关心异步操作的成功或失败状态,也可以使用finally
方法指定一个回调函数,无论Promise对象最终状态如何都会执行该函数。
------------------ -- - -------------------- ------------ ---
Promise链式调用
Promise支持链式调用,即在一个Promise对象的then
方法中返回另一个新的Promise对象。
----- -------- - --- ----------------- ------- -- - ------------- -- - ------------ -- ------ --- ----- -------- - -------------------- -- - ------ ------ - -- --- -------------------- -- - -------------------- -- ----- ---
上述代码中,通过promise1.then
方法返回了一个新的Promise对象promise2
,该对象的状态由promise1
决定,异步操作完成后将执行其指定的回调函数。
Promise进阶用法
Promise.all()
Promise.all()
方法接收一个Promise对象数组作为参数,返回一个新的Promise对象。当所有输入的Promise对象全部成功时,新的Promise对象状态变为fulfilled;当其中任意一个输入的Promise对象失败时,新的Promise对象状态变为rejected。
----- -------- - --- ----------------- ------- -- - ------------- -- - ----------------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ----------------- -- ------ --- ---------------------- ----------------------- -- - --------------------- -- ------------ -------- ---
Promise.race()
Promise.race()
方法接收一个Promise对象数组作为参数,返回一个新的Promise对象。当输入的Promise对象中有任意一个成功或失败时,新的Promise对象状态变为输入的那个Promise对象的状态。
----- -------- - --- ----------------- ------- -- - ------------- -- - ----------------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- ---------------- ---- ---------- -- ----- --- ----------------------- ---------------------- -- - -------------------- -- -------- -------------- -- - ----------------------------- -- -- ---------------------------------------------------------- ---------- -------------------------------------------------------------------------------------