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]
    
  • 相关阅读:
    ICEY修改实现ICEY锁血,修改data文件实现主之名关卡重现,顺便改金币
    gg修改器修改聚爆
    MOUSE_OVER 与 ROLL_OVER
    Tween 没有完毕 就停止
    如何将FLex AIR运行环境与AIR程序一起打包(转http://www.awsws.com/?p=94)
    做项目如做人
    flex 打开外部的swf 并调用其方法
    air 零散知识
    贝塞尔曲线的绘制
    air 读取sqlite的Date类型 解决方案
  • 原文地址:https://www.cnblogs.com/wbin91/p/5290790.html
Copyright © 2011-2022 走看看