最近准备面试,手动写个Promise常问问题,也写一个,后续有其他复杂的实现方式再加吧,目前就暂时写一个简单的,直接上代码。
// 自定义一个构造函数PromiseSelf
function PromiseSelf(handle) { // handle为处理器函数形参
this.status = 'pending'; // 设置状态
this.msg = ''; // 设置消息
var self = this;
handle(function (...arg) { // 立即执行handle函数,并传入两个参数,分别为成功回调(resolve)和失败回调(reject)
if (self.status !== 'pending') return;
self.status = 'resolve'; // 更新状态为resolve
self.msg = arg[0];
}, function (...arg) {
if (self.status !== 'pending') return;
self.status = 'reject'; // 更新状态为reject
self.msg = arg[0];
});
return this; // 返回PromiseSelf,以便链式调用
}
// 在构造函数PromiseSelf的原型上增加then方法并传入成功和失败的回调
PromiseSelf.prototype.then = function (rs, rj) { // then的两个参数rs,rj
if (this.status == 'resolve' && rs && typeof rs === 'function') {
rs(this.msg);
} else if (this.status == 'reject' && rj && typeof rj === 'function') {
rj(this.msg);
}
}
// 调用PromiseSelf
var mm = new PromiseSelf(function (resolve, reject) { // resolve, reject为形参
resolve('123'); // 触发成功(同时放开resolve和reject只会执行前面的一个)
// reject('haha~ 好嚣张!') // 触发失败
});
mm.then(function (successData) {
console.log(successData);
console.log("ok!");
}, function (failData) {
console.log(failData);
console.log('fail!');
});
写完发现这里有一个总结得比较好的,链接放上,供学习 面试官:“你能手写一个 Promise 吗”