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 };
// 得考虑三种状态
// 等待的状态
if (this.status === 'pending') {
// 成功集合
this.resolveArr.push(() => {
success(this.data);
});
// 失败的集合
this.rejecteArr.push(() => {
fail(this.data);
});
}
// 成功的状态
if (this.status === 'fulfilled') {
success(this.data);
}
// 失败的状态
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
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 加载图片,用promise resolve(img) 有两个作用, 一个是 改变状态,声明状态另一个是将返回值传递...
- 丁老师学习名言你用你会的知识去解释他, => 解释通了, 你就明白了=> 解释不通, 该学习了!! 继续.. ...
- 参考资源:【翻译】Promises/A+规范-图灵社区 BAT前端经典面试问题:史上最最最详细的手写Promise...