手写Promise.then方法
时间: 2023-10-21 09:54:30 浏览: 112
手写promise,实现
下面是手写一个简单的 Promise.then() 方法的实现方式:
```javascript
function MyPromise(executor) {
this.status = 'pending';
this.value = undefined;
this.onResolvedCallbacks = [];
const resolve = (value) => {
if (this.status === 'pending') {
this.status = 'fulfilled';
this.value = value;
this.onResolvedCallbacks.forEach((callback) => {
callback(this.value);
});
}
};
executor(resolve);
}
MyPromise.prototype.then = function (onResolved) {
return new MyPromise((resolve) => {
if (this.status === 'fulfilled') {
// 如果状态已经是 fulfilled,则直接执行回调函数
resolve(onResolved(this.value));
} else {
// 如果状态还是 pending,则将回调函数加入到待执行列表中
this.onResolvedCallbacks.push((value) => {
resolve(onResolved(value));
});
}
});
};
// 使用示例
const p = new MyPromise((resolve) => {
setTimeout(() => {
resolve('Hello, World!');
}, 2000);
});
p.then((value) => {
console.log(value); // 输出: 'Hello, World!'
}).then(() => {
console.log('Done');
});
```
在上述代码中,我们定义了一个 `MyPromise` 构造函数,它接受一个执行器函数 `executor`,并创建一个新的 Promise 对象。在 `MyPromise` 的原型上定义了 `then` 方法,用于添加回调函数。
在 `then` 方法中,我们首先判断当前 Promise 的状态。如果状态是已完成 (`fulfilled`),则直接执行传入的回调函数 `onResolved`,并使用 `resolve` 方法创建一个新的 Promise 对象,并将回调函数的返回值作为新 Promise 的值传递。
如果状态仍然是待定 (`pending`),则将回调函数加入到待执行列表 `onResolvedCallbacks` 中。当 Promise 的状态变为已完成时,会依次执行待执行列表中的回调函数,并传递相应的值。
需要注意的是,上述实现只是 Promise.then() 方法的简化版本,并没有考虑到其他情况(如错误处理、链式调用等)。完整的 Promise 实现还包括对这些情况的处理。
阅读全文