美文网首页
ES6-Promise原理

ES6-Promise原理

作者: LC_Ansel | 来源:发表于2019-02-23 15:59 被阅读0次
    function MyPromise (executor) {
        var self = this;
        self.status = 'pending';
        self.resolveValue = null;
        self.rejectReason = null;
        self.ResolveCallBackList = [];
        self.RejectCallBackList = [];
    
        function resolve (value) {
            if (self.status === 'pending') {
                self.status = 'Fulfilled';
                self.resolveValue = value;
                self.ResolveCallBackList.forEach(function (ele) {
                    ele();
                });
            }  
        }
    
        function reject (reason) {
            if (self.status === 'pending') {
                self.status = 'Rejected';
                self.rejectReason = reason;
                self.RejectCallBackList.forEach(function (ele) {
                    ele();
                });            
            }  
        }
    
        try {
            executor(resolve, reject);
        }catch(e) {
            reject(e);
        } 
    };
    
    function ResolutionRetrunPromise (nextPromise, returnValue, res, rej) {
        if (returnValue instanceof MyPromise) {
            // Promise 对象
            returnValue.then(function (val) {
                res(val);
            }, function (reason) {
                rej(reason)
            });
        }else {
            res(returnValue);
        }
    }
    
    MyPromise.prototype.then = function (onFulfilled, onRejected) {
        if (!onFulfilled) {
            onFulfilled = function (val) {
                return val;
            }
        }
        if (!onRejected) {
            onRejected = function (reason) {
                throw new Error(reason);
            }
        }    
        var self = this;
    
        var nextPromise = new MyPromise(function (res, rej) {
            if (self.status === 'Fulfilled') {
                setTimeout(function () {
                    try {
                        // var nextResolveValue = onFulfilled(self.resolveValue);
                        // res(nextResolveValue);
                        var nextResolveValue = onFulfilled(self.resolveValue);
                        ResolutionRetrunPromise(nextPromise, nextResolveValue, res, rej);
                    }catch(e) {
                        rej(e);
                    }
    
                }, 0);
            }
        
            if (self.status === 'Rejected') {
                setTimeout(function () {
                    try {
                        var nextRejectValue = onRejected(self.rejectReason);
                        ResolutionRetrunPromise(nextPromise, nextRejectValue, res, rej);
                    }catch(e) {
                        rej(e);
                    }
    
                }, 0);
            }
        
            // 
            if (self.status === 'pending') { 
                self.ResolveCallBackList.push(function () {
                    try {
                        var nextResolveValue = onFulfilled(self.resolveValue);
                        ResolutionRetrunPromise(nextPromise, nextResolveValue, res, rej);
                    }catch(e) {
                        rej(e);
                    }
                });
        
                self.RejectCallBackList.push(function () {
                    setTimeout(function () {
                        try {
                            var nextRejectValue = onRejected(self.rejectReason);
                            ResolutionRetrunPromise(nextPromise, nextRejectValue, res, rej);
                        }catch(e) {
                            rej(e);
                        }
                    }, 0);
                });        
            }
        });
        return nextPromise;
    };
    
    
    
    
    
    MyPromise.race = function(promiseArr) {
        return new MyPromise(function (resolve, reject) {
            promiseArr.forEach(function (promise, index) {
               promise.then(resolve, reject);
            });
        });
    };
    
    

    相关文章

      网友评论

          本文标题:ES6-Promise原理

          本文链接:https://www.haomeiwen.com/subject/vpspyqtx.html