简易Promise实现:从零开始构建JavaScript异步神器
1. 什么是Promise?
Promise 是 JavaScript 中一种异步编程的解决方案,它可以让我们用更优雅、简洁的方式来处理异步操作。通过使用Promise,我们可以避免回调地狱现象,提高代码的可读性和维护性。
2. Promise的基本使用方法
Promise 有三种状态:pending、fulfilled 和 rejected。当Promise实例化时,默认为pending状态。当异步操作成功时,转为fulfilled状态;当异步操作失败时,转为rejected状态。Promise对象提供了then和catch方法,分别处理成功和失败的情况。
以下是Promise的一个简单例子:
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success');
}, 500);
});
promise.then(value => {
console.log(value);
}).catch(error => {
console.log(error);
});
接下来,我们将手把手实现一个简易版Promise。
3. 实现一个简易版Promise
3.1 结构定义
首先,我们定义一个MyPromise类,并在类中定义三个状态常量。
class MyPromise {
static PENDING = 'pending';
static FULFILLED = 'fulfilled';
static REJECTED = 'rejected';
constructor(executor) {
// ...待实现
}
}
然后,我们在类的构造函数中定义状态,并定义成功和失败的结果。
class MyPromise {
// ...前面的代码
constructor(executor) {
this.status = MyPromise.PENDING;
this.value = null;
this.reason = null;
}
}
3.2 执行器
接下来,我们需要实现一个执行器函数,它接受两个参数:resolve和reject,用于改变Promise的状态。
在构造函数中,我们传入这两个参数,并进行异常捕获。
class MyPromise {
// ...前面的代码
constructor(executor) {
// ...前面的代码
try {
executor(this._resolve.bind(this), this._reject.bind(this));
} catch (error) {
this._reject(error);
}
}
_resolve(value) {
if (this.status === MyPromise.PENDING) {
this.status = MyPromise.FULFILLED;
this.value = value;
}
}
_reject(reason) {
if (this.status === MyPromise.PENDING) {
this.status = MyPromise.REJECTED;
this.reason = reason;
}
}
}
3.3 then方法
接下来,我们实现Promise的核心函数:then方法。该方法接受两个参数,分别用于处理成功和失败的情况。
我们在MyPromise类中定义then方法:
class MyPromise {
// ...前面的代码
then(onFulfilled, onRejected) {
if (this.status === MyPromise.FULFILLED) {
onFulfilled(this.value);
}
if (this.status === MyPromise.REJECTED) {
onRejected(this.reason);
}
}
}
3.4 catch方法
我们还需要实现catch方法,用于捕捉错误。catch方法本质上也是调用then方法。
class MyPromise {
// ...前面的代码
catch(onRejected) {
this.then(null, onRejected);
}
}
至此,我们已经实现了一个简易版的Promise。
4. 测试简易版Promise的功能
为了测试我们实现的简易版Promise是否可用,我们可以创建一些测试用例:
const myPromise = new MyPromise((resolve, reject) => {
setTimeout(() => {
resolve('success');
}, 500);
});
myPromise.then(value => {
console.log(value);
}).catch(error => {
console.log(error);
});
运行上面的代码,将在500毫秒后输出"success"。
5. 总结
本文手把手地实现了一个简易版Promise,通过这个过程,帮助我们更好地理解Promise的原理和实现。需要注意的是,本文实现的简易版Promise并不完善,有很多细节没有处理,例如链式调用等。
转载自:https://juejin.cn/post/7245836790040051770