// 声明构造函数
function Promise(executor) {
// 添加默认属性
this.PromiseState = 'pending';
this.PromiseResult = '';
// 接受多个then链式调用
this.callbacks = [];
const self = this;
// resolve函数
function resolve(data) {
if (self.PromiseState !== 'pending') return;
// 修改对象的状态
self.PromiseState = 'fulfilled';
// 设置对象结果的值
self.PromiseResult = data;
// 执行成功的回调
self.callbacks.forEach(item => {
item.onResolved(data)
})
}
// reject函数
function reject(data) {
if (self.PromiseState !== 'pending') return;
// 修改对象的状态
self.PromiseState = 'rejected';
// 设置对象结果的值
self.PromiseResult = data;
self.callbacks.forEach(item => {
item.onRejected(data)
})
}
// 声明执行器函数
try {
executor(resolve, reject);
} catch (e) {
reject(e)
}
}
// 添加then方法
Promise.prototype.then = function (onResolved, onRejected) {
const self = this;
return new Promise((resolve, reject) => {
// 封装函数
function callback(params) {
try {
let result = params(self.PromiseResult);
if (result instanceof Promise) {
result.then(v => {
resolve(v)
}, r => {
reject(r)
})
} else {
resolve(result)
}
} catch (e) {
reject(e)
}
}
// 调用回调函数
if (this.PromiseState === 'fulfilled') {
callback(onResolved)
}
if (this.PromiseState === 'rejected') {
callback(onRejected)
}
// 判断pending状态
if (this.PromiseState === 'pending') {
// 保存回调函数
this.callbacks.push({
onResolved() {
callback(onResolved)
},
onRejected() {
callback(onRejected)
}
})
}
})
}
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok')
reject("err")
// throw "erro
}, 1000);
})
const res = p.then(value => {
console.log(value);
// return "oh yee"
// throw "error"
}, reason => {
throw "error"
// console.warn(reason);
})
console.log(res);
promise函数封装(完整版)
猜你喜欢
转载自blog.csdn.net/weixin_44870644/article/details/114199206
今日推荐
周排行