Promise 终结(二):开启新的篇章
2024-01-06 01:30:12
手写一个promise终结(二)
Promise 解析与拒绝
在上次的文章中,我们了解到 Promise 有三个状态:等待态、完成态和失败态。其中,完成态和失败态统称为终结态。当 Promise 处于终结态时,它的状态将不会再发生改变。
Promise 的解析和拒绝是两个重要的概念,它们决定了 Promise 的最终状态。当 Promise 成功执行并产生结果时,它将被解析为完成态;当 Promise 执行失败时,它将被拒绝为失败态。
解析过程
解析过程是指将 Promise 从等待态转换为完成态的过程。当 Promise 成功执行并产生结果时,它将被解析为完成态。Promise 的解析可以通过两种方式触发:
-
通过
Promise.resolve()
方法:Promise.resolve()
方法可以将任何值解析为 Promise 对象。当Promise.resolve()
方法被调用时,它将立即返回一个处于完成态的 Promise 对象,并带有传入的值作为结果。 -
通过
then()
方法:当一个 Promise 的then()
方法被调用时,如果 Promise 处于等待态,它将被立即解析。如果 Promise 处于完成态,then()
方法将立即执行并返回一个新的 Promise 对象。
拒绝过程
拒绝过程是指将 Promise 从等待态转换为失败态的过程。当 Promise 执行失败时,它将被拒绝为失败态。Promise 的拒绝可以通过两种方式触发:
-
通过
Promise.reject()
方法:Promise.reject()
方法可以将任何值拒绝为 Promise 对象。当Promise.reject()
方法被调用时,它将立即返回一个处于失败态的 Promise 对象,并带有传入的值作为原因。 -
通过
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 的原因作为参数。
技巧与示例代码
-
使用
Promise.all()
方法来处理多个 Promise:Promise.all()
方法可以同时处理多个 Promise。当所有 Promise 都被解析时,Promise.all()
方法将返回一个 Promise 对象,并带有所有 Promise 的结果作为数组。 -
使用
Promise.race()
方法来处理第一个完成的 Promise:Promise.race()
方法可以处理多个 Promise,并返回第一个完成的 Promise 对象。 -
使用
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!');
});