返回
Promise.prototype.then方法源码剖析
前端
2023-09-30 10:56:05
Promise.prototype.then方法简介
Promise.prototype.then方法是Promise对象的一个实例方法,用于指定在Promise对象的状态改变后要执行的回调函数。它接收两个参数:onFulfilled和onRejected。onFulfilled是Promise对象状态变为fulfilled时要执行的回调函数,onRejected是Promise对象状态变为rejected时要执行的回调函数。
Promise.prototype.then方法源码剖析
then(onFulfilled, onRejected) {
const result = new Promise((resolve, reject) => {
const fulfillPromise = (value) => {
if (typeof onFulfilled === 'function') {
try {
const x = onFulfilled(value);
resolvePromise(promise2, x, resolve, reject);
} catch (err) {
reject(err);
}
} else {
resolve(value);
}
};
const rejectPromise = (reason) => {
if (typeof onRejected === 'function') {
try {
const x = onRejected(reason);
resolvePromise(promise2, x, resolve, reject);
} catch (err) {
reject(err);
}
} else {
reject(reason);
}
};
this.done(fulfillPromise, rejectPromise);
});
return result;
}
源码解析
- 首先,then方法返回一个新的Promise对象,这个新的Promise对象的状态取决于onFulfilled和onRejected回调函数的执行结果。
- 在新的Promise对象内部,首先定义了两个回调函数:fulfillPromise和rejectPromise。
- fulfillPromise回调函数用于处理Promise对象状态变为fulfilled时的逻辑。如果onFulfilled回调函数是一个函数,则执行该函数,并把Promise对象的状态变为fulfilled。如果onFulfilled回调函数不是一个函数,则直接把Promise对象的状态变为fulfilled。
- rejectPromise回调函数用于处理Promise对象状态变为rejected时的逻辑。如果onRejected回调函数是一个函数,则执行该函数,并把Promise对象的状态变为rejected。如果onRejected回调函数不是一个函数,则直接把Promise对象的状态变为rejected。
- 然后,调用this.done方法,传递fulfillPromise和rejectPromise回调函数作为参数。this.done方法是Promise对象的另一个实例方法,用于指定当Promise对象的状态改变后要执行的回调函数。
- 最后,返回新的Promise对象。
Promise.prototype.then方法的使用示例
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello, world!');
}, 1000);
});
promise.then((result) => {
console.log(result); // Hello, world!
});
在这个示例中,我们首先创建一个Promise对象,并指定了一个setTimeout函数作为其执行器。setTimeout函数在1秒后调用resolve函数,并将'Hello, world!'作为参数传递给resolve函数。
然后,我们调用Promise对象的then方法,并传递一个回调函数作为参数。这个回调函数会在Promise对象的状态变为fulfilled时执行。在回调函数中,我们使用console.log()函数打印Promise对象的状态。
1秒后,setTimeout函数执行,resolve函数被调用,Promise对象的状态变为fulfilled。此时,then方法指定的回调函数被执行,并将'Hello, world!'打印到控制台。
Promise.prototype.then方法的注意事项
在使用Promise.prototype.then方法时,需要注意以下几点:
- then方法总是返回一个新的Promise对象。
- then方法可以多次调用,每次调用都会返回一个新的Promise对象。
- then方法的回调函数可以是同步的或异步的。
- then方法的回调函数可以返回一个值或另一个Promise对象。
- then方法的回调函数如果抛出错误,则会使新的Promise对象的状态变为rejected。