Promise的.then方法
.then方法在Promise对象上定义,它允许我们为Promise的成功(fulfilled)和失败(rejected)状态分别指定回调函数。这些回调函数并不是立即执行的,而是被放入了微任务队列中,等待当前执行栈清空后,按照特定的时机执行。
微任务队列的时机
微任务队列的时机与Promise的状态密切相关。如果Promise的状态是pending,那么.then方法中的回调函数将不会被立即执行,而是等待Promise的状态变为fulfilled或rejected。一旦状态改变,相应的回调函数就会被放入微任务队列中,等待执行。
代码实现
在实现MyPromise类时,我们定义了_pushHandler方法,它负责将回调函数和它们的状态(fulfilled或rejected)一起放入处理队列中。这样,当Promise的状态改变时,我们可以遍历这个队列,执行相应的回调函数。
class MyPromise {
constructor(executor) {
this._state = PENDING; // 状态
this._value = undefined; // 数据
this._handlers = []; // 处理函数形成的队列
try {
executor(this._resolve.bind(this), this._reject.bind(this));
} catch (error) {
this._reject(error);
console.error(error);
}
}
_pushHandler(executor, state, resolve, reject) {
this._handlers.push({
executor,
state,
resolve,
reject,
});
}
then(onFulfilled, onRejected) {
return new MyPromise((resolve, reject) => {
this._pushHandler(onFulfilled, FULFILLED, resolve, reject);
this._pushHandler(onRejected, REJECTED, resolve, reject);
});
}
}
总结
通过深入理解Promise的.then方法和微任务队列的执行时机,我们可以更好地掌握异步编程的精髓。在实际开发中,合理使用Promise可以让我们写出更加清晰、易于维护的代码。