new Promise((resolve, reject) => {
}).then((res) => {
}, (err) => {
}).then(res => {
}).catch(reason => {
});
Promise.all([promise1, ...]).then();
实现以上
class Promise{
constructor(callback){
this.state = 'pending'; //状态
this.value = undefined; //自定义回调中的参数
this.fullfillAry = []; //成功回调数组
this.rejectAry = []; //失败回调数组
let resolveFn = (reason)=>{
if(this.state != 'pending'){
return;
}
//用setTimeout,即使Promise中是同步,也能保证先执行了then
let timer = setTimeout(()=>{
//改变状态
this.state = 'fullfilled'
//不同自定义中的回调,参数也可能不同,承上启下
this.value = reason;
this.fullfillAry.forEach(item => {
item(this.value);
})
},0)
}
let rejectFn = (reason)=>{
if(this.state != 'pending'){
return
}
let timer = setTimeout(()=>{
this.state = 'rejected';
this.value = reason;
this.rejectAry.forEach((item)=>{
item(this.value)
})
},0)
}
try{
//立刻执行new Promise时候的回调
callback(resolveFn, rejectFn)
}catch(err){
rejectFn(err)
}
}
then(fullfilledBC,rejectedBC){
// then返回的是一个 Promise实例,为实现链式调用
return new Promise((resolve, reject)=>{
this.fullfillAry.push(()=>{
try{
let x = fullfilledBC(this.value);
x instanceof Promise ? x.then(resolve, reject): resolve(x)
}catch(err){
reject(err)
}
})
this.rejectAry.push(()=>{
return new Promise((resolve, reject)=>{
this.rejectAry.push(()=>{
try{
let x = rejectedBC(this.value)
x instanceof Promise? x.then(resolve, reject) : resolve(x)
}catch(err){
reject(err)
}
})
});
})
})
}
catch(rejectedBC){
return then(null, rejectedBC)
}
static all(promiseAry){
let index = 0;
result = [];
return new Promise((resolve, reject)=>{
for(let i = 0; i < promiseAry.length; i++){
promiseAry[i].then((val)=>{
index ++;
result[i] = val;
if(index == promiseAry.length){
resolve(result)
}
}, reject)
}
})
}
}
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
Math.random()<0.5 ? resolve(100):reject(-100);
}, 1000)
}).then(res => {
return res + 1000
}, err => {
console.log(err);
}).then(res => {
console.log(res);
}, err => {
console.log(err);
})