js简单实现Promise功能

一直对Promise没有仔细看过,抽空一天把Prmose研究了下,下面是简单的实现过程:

附上Promise/A标准文档链接:https://promisesaplus.com/

(function(w) {
    function Promise(fn) {

       //函数参数验证
        printFnErrorInfo(fn);
        this.status = "pending";
        executor(fn, this);
    }

    Promise.resolve = function(value) {
        if(this == Promise) {
            return new Promise(function(resolve, reject) {
                resolve(value);
            });
        }
        
        if(this.status != "pending") {
            return;
        }
        
        this.status = "fulfilled"
        handleResult(this.status, value, this);
    }

    Promise.reject = function(value) {
        if(this == Promise) {
            return new Promise(function(resolve, reject) {
                reject(value);
            });
        }
        
        if(this.status != "pending") {
            return;
        }
        
        status = "rejected"
        handleResult(status, value, this)
    }

    Promise.prototype.then = function(onFulfilled, onRejected) {
        this._onFulfilled = onFulfilled;
        this._onRejected = onRejected
        return new Promise(function(resolve, reject) {});
    }

    function handleResult(status, value, ctx) {
        setTimeout(function() {
            var result;
            if(status == "fulfilled") {
                result = ctx._onFulfilled(value);
            } else if(status == "rejected") {
                result = ctx._onRejected(value);
            }
            if(isPormise(result)) { //如果是Promise对象,将默认的处理函数赋值给新的Promise对象,这是处理链式执行的关键
                ctx.then = result;
                result._onFulfilled = ctx.then._onFulfilled;
                result._onRejected = ctx.then._onRejected
            } else {
                ctx.then && ctx.then._onFulfilled && ctx._onFulfilled(result);
            }
        });
    }

    function executor(fn, ctx) {
        var retResult = fn(Promise.resolve.bind(ctx), Promise.reject.bind(ctx));
    }

    function printFnErrorInfo() {
        var fns = Array.prototype.slice.call(arguments, 0);
        if(!fns || fns.length == 0) {
            throw new Error("Promise resolver undefined is not a function");
        }
        fns.forEach(function(fn, i) {
            if(!typeof fn === 'function') {
                throw new Error("Promise resolver " + fn + " is not a function");
            }
        })

    }

    function isPormise(obj) {
        return obj && obj.constructor === Promise;
    }
    w.Promise = Promise;
})(window);

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值