返回

揭秘手写Promise核心原理(二)——深究then方法

前端

深入探秘 Promise 的 then 方法:核心原理与应用

一、then 方法的结构与参数

then 方法是 Promise 的核心方法之一,它用于处理 Promise 的异步结果。其基本结构如下:

promise.then(onFulfilled, onRejected);

其中:

  • onFulfilled:当 Promise 状态变为 "已完成" 时执行的回调函数。
  • onRejected:当 Promise 状态变为 "已拒绝" 时执行的回调函数。

两个回调函数都是可选的。如果省略 onFulfilled 回调函数,则 then 方法将返回一个新 Promise,其状态与原始 Promise 相同。如果省略 onRejected 回调函数,则 then 方法将抛出原始 Promise 拒绝的原因。

二、then 方法的内部运作机制

then 方法的内部运作机制大致分为以下几个步骤:

  1. 接收参数 :接收 onFulfilledonRejected 回调函数。
  2. 返回新 Promise :返回一个新 Promise,其状态取决于原始 Promise 的状态。
  3. 根据 Promise 状态执行回调函数 :当原始 Promise 的状态改变时,then 方法将根据其状态执行对应的回调函数。

三、then 方法的应用场景

then 方法主要用于处理 Promise 的异步结果,在以下场景中十分有用:

  • 更新用户界面
  • 显示数据
  • 执行其他异步操作

四、then 方法的注意事项

使用 then 方法时,需要特别注意以下几点:

  • then 方法可以多次调用,每次调用都会返回一个新的 Promise。
  • then 方法的回调函数是异步执行的,这意味着它们将在异步任务完成后再执行。
  • then 方法的回调函数可以有返回值,返回值将作为下一个 then 方法的回调函数的参数。
  • then 方法可以处理异常。如果 then 方法的回调函数抛出异常,则 then 方法会将此异常传递给下一个 then 方法的回调函数。

五、代码示例

以下是一个使用 then 方法的代码示例:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("任务完成"), 1000);
});

promise
  .then((result) => {
    console.log(`任务完成,结果:${result}`);
  })
  .catch((error) => {
    console.error(`任务失败,原因:${error}`);
  });

常见问题解答

  1. then 方法和 catch 方法有什么区别?

    catch 方法仅处理 Promise 的拒绝状态,而 then 方法可以处理 Promise 的所有状态(已完成、已拒绝和等待)。

  2. then 方法可以多次调用吗?

    是的,then 方法可以多次调用,每次调用都会返回一个新的 Promise。

  3. then 方法的回调函数可以在哪种情况下抛出异常?

    onFulfilledonRejected 回调函数出现错误时,then 方法会将此异常传递给下一个 then 方法的回调函数。

  4. then 方法返回什么?

    then 方法返回一个新的 Promise,其状态取决于原始 Promise 的状态。

  5. 如何取消 then 方法?

    then 方法无法取消,因为 Promise 是不可变的。要取消异步操作,需要使用其他机制,例如 AbortController

结语

then 方法是 Promise 的核心方法,它可以用来处理异步结果和执行回调函数。通过对 then 方法的深入理解,我们可以更有效地使用 Promise,并编写更加健壮和可维护的代码。