模拟实现一个 Promise.finally
时间: 2024-04-24 19:26:19 浏览: 30
好的,我可以帮你模拟实现一个 Promise.finally 方法。这个方法会在 Promise 完成或被拒绝后都会执行一段回调函数。
首先,我们需要创建一个 Promise 类,它包含一个状态和相关的方法:
```javascript
class MyPromise {
constructor(executor) {
this.state = 'pending';
this.value = undefined;
this.error = undefined;
this.finallyCallback = undefined;
const resolve = value => {
if (this.state === 'pending') {
this.state = 'fulfilled';
this.value = value;
if (this.finallyCallback) {
this.finallyCallback();
}
}
};
const reject = error => {
if (this.state === 'pending') {
this.state = 'rejected';
this.error = error;
if (this.finallyCallback) {
this.finallyCallback();
}
}
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
finally(callback) {
if (this.state !== 'pending') {
callback();
} else {
this.finallyCallback = callback;
}
}
}
```
在这个实现中,我们使用了一个 `finallyCallback` 属性来保存传入的回调函数。当 Promise 的状态变为 `fulfilled` 或 `rejected` 时,如果有回调函数存在,就会执行它。
接下来,我们可以使用这个自定义的 Promise 类来测试实现的 `finally` 方法:
```javascript
const promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
resolve('Success');
}, 2000);
});
promise
.then(value => {
console.log(value);
})
.finally(() => {
console.log('Finally callback executed');
});
```
这段代码创建了一个 Promise,经过2秒后状态变为 `fulfilled`,然后会执行 `then` 方法中的回调函数,并在最后执行 `finally` 方法中的回调函数。
希望这个简单的实现能帮到你!
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)