推荐答案
Promise 是 JavaScript 中用于处理异步操作的对象。它代表一个异步操作的最终完成(或失败)及其结果值。
then()
方法:- 用于指定 Promise 对象成功(fulfilled)时的回调函数。
- 接收两个可选参数:第一个参数是
onFulfilled
函数(Promise 成功时执行),第二个参数是onRejected
函数(Promise 失败时执行,等同于catch()
)。 - 返回一个新的 Promise 对象,允许链式调用。
catch()
方法:- 用于指定 Promise 对象失败(rejected)时的回调函数。
- 等同于
then(null, onRejected)
的语法糖。 - 返回一个新的 Promise 对象,允许链式调用。
finally()
方法:- 用于指定 Promise 对象无论成功还是失败都会执行的回调函数。
- 不接收参数,因为无法得知 Promise 的最终状态。
- 主要用于执行清理操作,比如关闭加载指示器。
- 返回一个新的 Promise 对象,但是其状态和值与原始 Promise 保持一致,传递到下一个
then()
或catch()
中。
本题详细解读
Promise 的基本概念
Promise 是一种处理异步操作的机制,它有三种状态:
- pending (等待): 初始状态,既不是 fulfilled 也不是 rejected。
- fulfilled (已完成): 异步操作成功完成。
- rejected (已拒绝): 异步操作失败。
Promise 实例一旦从 pending 状态变为 fulfilled 或者 rejected,就不能再改变状态。
then()
方法详解
then()
方法接收两个回调函数:onFulfilled
和 onRejected
。
onFulfilled(value)
: 当 Promise 状态变为fulfilled
时执行,value
参数是 Promise 成功的结果。onRejected(reason)
: 当 Promise 状态变为rejected
时执行,reason
参数是 Promise 失败的原因。
then()
方法返回一个新的 Promise 对象。这意味着可以使用链式调用,例如:
-- -------------------- ---- ------- --- ----------------- ------- -- - ------------- -- - ---------------- -- ------ -- -------------- -- - --------------------- -------- -- --- ------ ---- ------ --------- -- -------------- -- - --------------------- -------- -- --- ------ ------ --
如果 onFulfilled
或 onRejected
返回的是 Promise 对象,那么下一个 then()
方法会在这个返回的 Promise 对象变为 fulfilled 或 rejected 状态时执行。
catch()
方法详解
catch(onRejected)
方法是 then(null, onRejected)
的语法糖,它只处理 Promise 的 rejected 状态。可以使用它来捕获 promise 链中的任何错误。例如:
-- -------------------- ---- ------- --- ----------------- ------- -- - ------------- -- - --------------- -- ------ -- -------------- -- - ------------------- -------- -- -------------- -- - --------------------- ------- -- --- ------ ---- ---
catch()
返回的也是一个新的 Promise,所以也支持链式调用。
finally()
方法详解
finally(callback)
方法指定无论 Promise 成功(fulfilled)还是失败(rejected)都会执行的回调函数。finally()
不接收任何参数,也无法得知 Promise 的状态。
finally()
主要用于执行清理操作,例如:
-- -------------------- ---- ------- --- ------- - ----- -------- ------------ ------- - ----- ---------------------- ------ --- ------------------------ --- ---------------- ----- ------- - ------------- - ---- ----------- ------------------ ---- ----------------- ------- -- - ----------- ------------- ----------------- -- ------------ --- ------------------ -- -------------- ------- - ------ -------------------- --
finally()
方法会始终执行,无论 fetchData
的结果如何, loading
都会设置为 false
。
总结
(本题无需总结,因为题目要求结尾不要有总结)