zoukankan      html  css  js  c++  java
  • 简单的 Promise 实现

    参考 http://www.tuicool.com/articles/RzQRV3

    var PENDING = undefined,
        FULLFILLED = 1,
        REJECTED = 2;
    var Promise = function(resolver) {
    
        var promise = this;
        this.value;
        this.reason;
        this.status = PENDING;
        this.resolver;
        this.rejecter;
    
        var resolve = function(value) {
            promise.value = value;
            promise.status = FULLFILLED;
            if (promise.resolver || promise.rejecter) {
                var ret = promise.resolver.call(null, promise.value);
                if(ret instanceof Promise) {
                    ret.then(promise.resolver_relsolve);
                } else {
                    promise.resolver_relsolve(promise.value);
                }
            }
        }
    
        var reject = function(err) {
            promise.value = err;
            promise.status = REJECTED;
            if (promise.resolver || promise.rejecter) {
                var ret = promise.rejecter.call(null, promise.value);
                if(ret instanceof Promise) {
                    ret.then(function(){}, promise.rejecter_reject);
                } else {
                    promise.rejecter_reject(promise.value);
                }
            }
        }
        
        resolver(resolve, reject);
    }
    
    // Promise then 方法
    Promise.prototype.then = function(onFulfilled, onRejected) {
        var promise = this;
    
        if (promise.status == FULLFILLED) {
            var ret = onFulfilled(promise.value);
    
            if(ret instanceof Promise) {
                return ret;
            } else {
                return new Promise(function(resolve) {
                    resolve(ret);
                });
            }
    
        } else if (promise.status == REJECTED) {
            var ret = onRejected(promise.value);
    
            if(ret instanceof Promise) {
                return ret;
            } else {
                return new Promise(function(resolve, reject) {
                    reject(ret);
                });
            }    
        }
    
        return new Promise(function(resolve, reject) {
            promise.resolver = onFulfilled;
            promise.resolver_relsolve = resolve;
            promise.rejecter = onRejected;
            promise.rejecter_reject = reject;
        });
    }
    

    测试

    var p = new Promise(function(resolve, reject) {
        console.log('before');
        setTimeout(function() {
            resolve(10);
        }, 2000);
    });
    
    p.then(function() {
        console.log('after', arguments);
    }).then(function() {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve(20)
            }, 2000);
        });
    }).then(function() {
        console.log(arguments);
    });
    

    输出

    // 两秒
    before
    after [10]
    // 两秒
    [20]
    
  • 相关阅读:
    打印二叉树中节点的所有祖先
    1.把2叉查找树转换成双向链表
    Linux下tar.xz结尾的文件的解压方法
    Floyd算法
    c缺陷与陷阱笔记-第七章 可移植性代码
    c缺陷与陷阱笔记-第六章 预处理器
    c缺陷与陷阱笔记-第四章 连接
    C语言小程序(四)、杨辉三角
    C语言小程序(三)、判断两个日期之差
    C语言小程序(二)、计算第二天日期
  • 原文地址:https://www.cnblogs.com/wbin91/p/5290790.html
Copyright © 2011-2022 走看看