返回

Promise 终结(二):开启新的篇章

前端

手写一个promise终结(二)

Promise 解析与拒绝

在上次的文章中,我们了解到 Promise 有三个状态:等待态、完成态和失败态。其中,完成态和失败态统称为终结态。当 Promise 处于终结态时,它的状态将不会再发生改变。

Promise 的解析和拒绝是两个重要的概念,它们决定了 Promise 的最终状态。当 Promise 成功执行并产生结果时,它将被解析为完成态;当 Promise 执行失败时,它将被拒绝为失败态。

解析过程

解析过程是指将 Promise 从等待态转换为完成态的过程。当 Promise 成功执行并产生结果时,它将被解析为完成态。Promise 的解析可以通过两种方式触发:

  1. 通过 Promise.resolve() 方法:Promise.resolve() 方法可以将任何值解析为 Promise 对象。当 Promise.resolve() 方法被调用时,它将立即返回一个处于完成态的 Promise 对象,并带有传入的值作为结果。

  2. 通过 then() 方法:当一个 Promise 的 then() 方法被调用时,如果 Promise 处于等待态,它将被立即解析。如果 Promise 处于完成态,then() 方法将立即执行并返回一个新的 Promise 对象。

拒绝过程

拒绝过程是指将 Promise 从等待态转换为失败态的过程。当 Promise 执行失败时,它将被拒绝为失败态。Promise 的拒绝可以通过两种方式触发:

  1. 通过 Promise.reject() 方法:Promise.reject() 方法可以将任何值拒绝为 Promise 对象。当 Promise.reject() 方法被调用时,它将立即返回一个处于失败态的 Promise 对象,并带有传入的值作为原因。

  2. 通过 catch() 方法:当一个 Promise 的 catch() 方法被调用时,如果 Promise 处于等待态,它将被立即拒绝。如果 Promise 处于失败态,catch() 方法将立即执行并返回一个新的 Promise 对象。

状态管理

Promise 的状态管理是通过一个叫做「状态机」的机制来实现的。状态机是一个用于跟踪 Promise 状态的抽象概念。状态机可以处于三个状态之一:等待态、完成态和失败态。

当 Promise 被创建时,它将被初始化为等待态。当 Promise 被解析或拒绝时,它的状态将从等待态变为完成态或失败态。一旦 Promise 进入终结态,它的状态将不会再发生改变。

处理 Promise 结果

为了处理 Promise 的结果,我们可以使用 then() 方法和 catch() 方法。then() 方法用于处理 Promise 的完成态结果,而 catch() 方法用于处理 Promise 的失败态结果。

then() 方法接受两个参数:一个成功回调函数和一个失败回调函数。当 Promise 被解析时,成功回调函数将被调用,并带有 Promise 的结果作为参数。当 Promise 被拒绝时,失败回调函数将被调用,并带有 Promise 的原因作为参数。

catch() 方法只接受一个参数:一个失败回调函数。当 Promise 被拒绝时,失败回调函数将被调用,并带有 Promise 的原因作为参数。

技巧与示例代码

  1. 使用 Promise.all() 方法来处理多个 Promise:Promise.all() 方法可以同时处理多个 Promise。当所有 Promise 都被解析时,Promise.all() 方法将返回一个 Promise 对象,并带有所有 Promise 的结果作为数组。

  2. 使用 Promise.race() 方法来处理第一个完成的 Promise:Promise.race() 方法可以处理多个 Promise,并返回第一个完成的 Promise 对象。

  3. 使用 Promise.finally() 方法来处理 Promise 的完成或失败:Promise.finally() 方法在 Promise 完成或失败后执行,无论 Promise 是被解析还是被拒绝。

// 解析一个 Promise
const promise = Promise.resolve('Hello, world!');

promise.then((result) => {
  console.log(result); // 输出:Hello, world!
});

// 拒绝一个 Promise
const promise = Promise.reject(new Error('Something went wrong!'));

promise.catch((error) => {
  console.log(error.message); // 输出:Something went wrong!
});

// 使用 Promise.all() 处理多个 Promise
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3]).then((results) => {
  console.log(results); // 输出:[1, 2, 3]
});

// 使用 Promise.race() 处理第一个完成的 Promise
const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Hello, world!');
  }, 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Goodbye, world!');
  }, 2000);
});

Promise.race([promise1, promise2]).then((result) => {
  console.log(result); // 输出:Hello, world!
});

// 使用 Promise.finally() 处理 Promise 的完成或失败
const promise = Promise.resolve('Hello, world!');

promise.finally(() => {
  console.log('Promise is completed!');
});