var Waiter = function() {
    var dfd = [],
        doneArr = [],
        failArr = [],
        slice = Array.prototype.slice,
        that = this;
    var Primise = function() {
        this.resolved = false;
        this.rejected = false;
    }
    Primise.prototype = {
        resolve: function() {             this.resolved = true;
            if (!dfd.length) {
                return;
            }
            for (var i = dfd.length - 1; i >= 0; i--) {
                if (dfd[i] && !dfd[i].resolved || dfd[i].rejected) {
                    return;
                }
                dfd.splice(i, 1);
            }
            _exec(doneArr);
        },
        reject: function() {
            this.rejected = true;
            if (!dfd.length) {
                return;
            }
            dfd.splice(0);
            _exec(failArr);
        }
    }
    that.Deferred = function() {
        return new Primise();
    }     function _exec(arr) {
        var i = 0,
            len = arr.length;
        for (; i < len; i++) {
            try {
                arr[i] && arr[i]();
            } catch (e) {}
        }
    };
    that.when = function() {         dfd = slice.call(arguments);
        var i = dfd.length;
        for (--i; i >= 0; i--) {
            if (!dfd[i] || dfd[i].resolved || dfd[i].rejected || !dfd[i] instanceof Primise) {
                dfd.splice(i, 1);
            }
        }
        return that;
    };
    that.done = function() {         doneArr = doneArr.concat(slice.call(arguments));
        return that;
    };
    that.fail = function() {
        failArr = failArr.concat(slice.call(arguments));
        return that;
    };
}; var waiter = new Waiter(); var first = function() {
    var dtd = waiter.Deferred();
    setTimeout(function() {
        console.log('first finish');
        dtd.resolve();
    }, 5000);
    return dtd;
}(); var second = function() {
    var dtd = waiter.Deferred();
    setTimeout(function() {
        console.log('second finish');
        dtd.resolve();
    }, 0);
    return dtd;
}(); waiter.when(first, second).done(function() {
    console.log('first success');
}, function() {
    console.log('second success');
}).fail(function() {
    console.log('fail');
})

最新文章

  1. C++ map的基本操作和使用
  2. MAC解决端口占用
  3. logback 常用配置详解(二) &lt;appender&gt;
  4. 51nod 1076强连通
  5. WebService核心之WSDL深入详解
  6. 教你安装漂亮的Arc GTK主题
  7. 在JSP页面显示九九乘法表
  8. VS 2010 编译安装 boost 库 -(和 jsoncpp 库共存)
  9. 【BZOJ 1563】 [NOI2009]诗人小G
  10. JavaScript学习笔记--ES6学习(五) 数值的扩展
  11. POJ2240 Arbitrage(最短路)
  12. poj 3237 Tree(树链拆分)
  13. Spring学习---JPA学习笔记
  14. Cookie 进阶
  15. Android 4.1.2系统添加重启功能
  16. Tiny4412模式跳转
  17. linux如何查看所有的用户和组信息?
  18. [UE4]AttachToComponent的AttachmentRule
  19. JAVA性能优化:35个小细节让你提升java代码的运行效率
  20. 洛谷P3952 时间复杂度【字符串】【模拟】

热门文章

  1. win10专业版Hyper-v下Docker挂载volume的方式使用Gitlab(汉化版)保存资料数据(使用外部redis)
  2. AspNetCore使用MySQL
  3. 行人重识别(ReID) ——基于深度学习的行人重识别研究综述
  4. (转)Centos7下杀毒软件clamav的安装和使用
  5. ARM Linux BenchMark
  6. Arrays基本使用
  7. 00.斐波那契数列第n项
  8. pycharm安装第三方库失败module &#39;pip&#39; has no attribute &#39;main&#39;
  9. 批处理bat文件显示中文乱码解决方式
  10. SPFA的两个优化