一步一步写出自己的Promise源码

 先贴出代码;

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
class AbsPromise {
    constructor() {
        this.value = '';
        this.status = PENDING;
        this.onresolvedQueue = [];
        this.onrejectedQueue = [];
        this._ID_ = Date.now()+Math.random();
    }
    then(){
        
    }
}

class Promise extends AbsPromise {
    constructor(handle) {
        super();
        handle(Promise._resolve(this), Promise._reject(this));
    }
    static _resolve(context) {
        return function (value) {
            // TODO value是一个promise,会等待value的状态
            if (context.status !== PENDING) {
                return;
            }
            context.status = FULFILLED;
            context.value = value;
            if (value instanceof Promise) {
                value.then(Promise._resolve(value), Promise._reject(value));
            }
            let job;
            while (job = context.onresolvedQueue.shift()) {
                job.call(context, value);
            }
        }
    }
    static _reject(context) {
        return function(){
            if (context.status !== PENDING) {
                return;
            }
            context.status = REJECTED;
            context.value = reason;
            let job;
            while (job = context.onresolvedQueue.shift()) {
                job.call(context, value);
            }
        }
    }
    then(onresolve, onreject){
        const that = this;
        return new Promise(function(resolve, reject){
             const resolveCb = that.resolveCb(onresolve, resolve, reject),
                   rejectCb = that.rejectCb(onresolve, resolve, reject),
                   cb = that.didThen(resolveCb, rejectCb);
                   cb();
        });
    }
    resolveCb(onresolve, resolve, reject){
        return (value) => {
            setTimeout(()=>{
                if(typeof onresolve != 'function') {
                    resolve(value);
                }
                const res = onresolve(value);
                if (res instanceof Promise) {
                    return res.then(resolve, reject);
                }
                resolve(res);
            });
        }
    }
    rejectCb(onreject, resolve, reject) {
        return (error) => {
            setTimeout(()=>{
                if(typeof onreject != 'function') {
                    resolve(error);
                }
                const res = onreject(error);
                if (res instanceof Promise) {
                    return res.then(resolve, reject);
                }
                resolve(res);
            });
        }
    }
    didThen(resolveed, rejected){
        const that = this, staus = that.status, value = that.value;
        return {
            [PENDING]: function(){
                that.onresolvedQueue.push(resolveed);
                that.onrejectedQueue.push(rejected);
            },
            [FULFILLED]: function(){
                resolveed(value);
            },
            [REJECTED]: function(){
                rejected(value);
            } 
        }[staus];
    }
}
var test = new Promise((resolve) => {
    console.log(1);
    setTimeout(()=>{console.log(3);resolve(4)});
});
var test2 = test.then((v)=>{console.log(v,5)});
var test3 = test.then((v)=>{console.log(v,6)});
console.log(2, test,test2,test3)
setTimeout(()=>{console.log(7,test,test2,test3)},100);

二 分析Promise构造函数和executor

待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值