1.resolve 函数会修改对象的状态和设置对象结果值,所以首先先去添加对象状态属性和对象结果属性
function Promise(executor) {
this.PromiseState = "pending";
this.PromiseResult = null;
function resolve(data) {}
function reject(data) {}
executor(resolve, reject);
}
2.在定义的 resolve 中进行功能实现, 此时不能直接 this.PromiseState = 'resolved',因为这个 resolve 在调用的时候是直接调用的,this 指向 window,所以我们需要保存实例 this
function Promise(executor) {
const self = this;
this.PromiseState = "pending";
this.PromiseResult = null;
function resolve(data) {}
function reject(data) {}
executor(resolve, reject);
}
3.然后在定义的 resolve 函数里进行功能实现,reject 函数同理
function Promise(executor) {
const self = this;
this.PromiseState = "pending";
this.PromiseResult = null;
function resolve(data) {
self.PromiseState = "resolved";
self.PromiseResult = data;
}
function reject(data) {
self.PromiseState = "rejected";
self.PromiseResult = data;
}
executor(resolve, reject);
}
4.throw 抛出异常改变状态
要处理 throw 抛出的异常,就需要 try...catch,现在就是考虑加在哪里,throw 是在执行器中执行,所以我们需要把 try 包裹 executor
function Promise(executor) {
this.PromiseState = "pending";
this.PromiseResult = null;
function resolve(data) {
self.PromiseState = "resolved";
self.PromiseResult = data;
}
function reject(data) {
self.PromiseState = "rejected";
self.PromiseResult = data;
}
try {
executor(resolve, reject);
} catch (e) {}
}
然后在 catch 修改 promise 的状态为失败,调用 reject 方法将状态改为失败,抛出的错误会传给 catch(e)的 e,所以我们只需要把 e 传给 reject()就好
function Promise(executor) {
this.PromiseState = "pending";
this.PromiseResult = null;
function resolve(data) {
self.PromiseState = "resolved";
self.PromiseResult = data;
}
function reject(data) {
self.PromiseState = "rejected";
self.PromiseResult = data;
}
try {
executor(resolve, reject);
} catch (e) {
reject(e);
}
}
5.promise 对象状态只能修改一次
promise 对象状态只能修改一次,所以我们在修改状态的时候要先看一下这个状态是否已经改变了,在 resolve 和 reject 函数中加个判断,如果状态为 pending 就执行,不是就直接 return
function Promise(executor) {
this.PromiseState = "pending";
this.PromiseResult = null;
function resolve(data) {
if (self.PromiseState !== "pending") return;
self.PromiseState = "resolved";
self.PromiseResult = data;
}
function reject(data) {
if (self.PromiseState !== "pending") return;
self.PromiseState = "rejected";
self.PromiseResult = data;
}
try {
executor(resolve, reject);
} catch (e) {
reject(e);
}
}