class Mypromise {
constructor(cb) {
this.status = 'pending';
this.data = null;
this.resolveArr = [];
this.rejecteArr = [];
this.resolve = val => {
if (this.status === 'pending') {
this.status = 'fulfilled';
this.data = val
this.resolveArr.forEach(cbs=> {
cbs();
})
}
}
this.reject = err => {
if (this.status === 'pending') {
this.status = 'rejected';
this.data = err
this.rejecteArr.forEach(cbs => {
cbs();
})
}
}
cb(this.resolve, this.reject);
}
then(success, fail) {
success = typeof success === 'function' ? success : function (val) { return val };
fail = typeof fail === 'function' ? fail : function (val) { return val };
// 得考慮三種狀態(tài)
// 等待的狀態(tài)
if (this.status === 'pending') {
// 成功集合
this.resolveArr.push(() => {
success(this.data);
});
// 失敗的集合
this.rejecteArr.push(() => {
fail(this.data);
});
}
// 成功的狀態(tài)
if (this.status === 'fulfilled') {
success(this.data);
}
// 失敗的狀態(tài)
if (this.status === 'rejected') {
fail(this.data);
}
}
catch(fail){
this.then(null, fail);
}
}
// 自己的
let mpro = new Mypromise(function (resolve, reject) {
// 同步
// resolve(1);
// reject(0);
// 異步
setTimeout(() => {
resolve(22222);
// reject(-1);
},1000);
});
mpro.then((data) => {
console.log(data, '成功了');
}, (err) => {
console.log(err, '失敗了');
});
mpro.catch((err) => {
console.log(err, 'err');
});
封裝Promise
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 加載圖片,用promise resolve(img) 有兩個(gè)作用, 一個(gè)是 改變狀態(tài),聲明狀態(tài)另一個(gè)是將返回值傳遞...
- 丁老師學(xué)習(xí)名言你用你會(huì)的知識(shí)去解釋他, => 解釋通了, 你就明白了=> 解釋不通, 該學(xué)習(xí)了!! 繼續(xù).. ...
- 參考資源:【翻譯】Promises/A+規(guī)范-圖靈社區(qū) BAT前端經(jīng)典面試問題:史上最最最詳細(xì)的手寫Promise...