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);

 

 


版权声明:本文为Kuyin328178972原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。