廢話不多說,直接上代碼
class MyPromise {
constructor(fn) {
this._succ_res = null;
this._err_res = null;
this.status = '';
this.callback_arr = [];
let that = this;
fn(function (res) {
that._succ_res = res;
that.status = 'succ';
if(that.callback_arr){
that.callback_arr.forEach(element => {
element.fn1(res)
});
}
}, function (err) {
that._err_res = err;
that.status = "error";
if(that.callback_arr){
that.callback_arr.forEach(element => {
element.fn2(err)
});
}
})
}
then(fn1, fn2) {
if (this.status === 'succ') {
fn1(this._succ_res);
} else if (this.status === 'error') {
fn2(this._err_res)
}else{
this.callback_arr.push({fn1,fn2})
}
}
static all(arr){
return new MyPromise((resolve,reject)=>{
let index = 0
let result = []
next();
function next(){
arr[index].then(function(res){
result.push(res)
index++;
if(index === arr.length){
resolve(result)
}else{
next()
}
},reject)
}
})
}
}
MyPromise.all([test(11,true),test(22)]).then(function(arr){
console.log(arr)
},function(){
console.log('失敗了')
})
//異步測試函數(shù)
function test(num,succ){
return new MyPromise(function(resolve,reject){
setTimeout(function(){
if(succ){
resolve(num)
}else{
reject()
}
},2000)
});
}
test(66,true).then(function(res){
console.log(res)
},function(){
console.log('失敗了')
})
嗯,就是這樣的,隨手做了兩個測試,一點問題也沒有,代碼實現(xiàn)比較簡單,就不多說了.