myPromise
/**
* @description 行参可能是一个 定时器 随意我们要把 then 之后方法存起来
* @param exector 函数
*/
function Promise(exector){
let _this=this;
_this.status='pending';
_this.onResolved = [];
_this.onRejected = [];
function resolve(val){
if(_this.status==='pending'){
_this.val=val;
_this.status = 'resolve';
_this.onResolved.forEach(v=>v());
}
}
function reject(reason){
if(_this.status==='pending'){
_this.reason = reason;
_this.status = 'reject';
_this.onRejected.forEach(v=>v());
}
}
// 检测错误
try {
executor(resolve, reject)
} catch (error) {
reject(error)
}
exector(resolve,reject)
}
/***
* @onfulfilled 成功的会调用函数
* @onrejected 失败的回调函数
* @description 返回一个promise对象
*/
Promise.prototype.then=function(onfulfilled, onrejected){
let self = this;
onfulfilled=typeof onfulfilled === 'function'?onfulfilled:val=>val;
onrejected =typeof onrejected === 'function'?onrejected: err=>{
throw err;
}
let promise2 = new Promise((resolve,reject)=>{
if(self.status=='resolve'){
setTimeout(()=>{
let x = onfulfilled(self.value);
resolvePromise(promise2, x, resolve, reject);
},0)
}
if(self.status=='reject'){
setTimeout(()=>{
let x = onrejected(self.value);
resolvePromise(promise2, x, resolve, reject);
},0)
}
// 处理外部异步
if(self.status=='pending'){
self.onResolved.push(function () {
setTimeout(() => {
try {
let x = onfulfilled(self.value);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
}, 0);
});
self.onRejected.push(function () {
setTimeout(() => {
try {
let x = onrejected(self.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
}, 0);
});
}
})
return promise2;
}
function resolvePromise(promise2, x, resolve, reject){
if(x===promise2){
reject(new TypeError('循环'))
}
let b;
if(x!=null&&(typeof x === 'object'||typeof x==='function')){
let then = x.then;
if(typeof then ==='function'){
then.call(x,(y)=>{
if(b)return;
b=true;
//递归解析
resolvePromise(promise2,y,resolve,reject)
},(e)=>{
if(b)return;
b=true;
reject(e)
})
}else{
if(b)return;
b=true;
reject(e)
}
}else{
if(b)return;
b=true;
resolve(x)
}
}