zoukankan      html  css  js  c++  java
  • Waiter.js

    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');
    })
  • 相关阅读:
    关于http与https之间的区别
    成功解决react+webpack打包文件过大的问题(时间已久,不建议继续阅读)
    使用angularjs实现注册表单
    在jQuery中使用canvas时遇到的问题
    使用canvas实现绚丽的时钟特效
    HTML5中的DOM新特性
    JavaScript中DOM节点层次Text类型
    wx小程序 createRewardedVideoAd
    移动端项目构建 [笔记]
    wx 小程序 | textarea +
  • 原文地址:https://www.cnblogs.com/shidengyun/p/5338754.html
Copyright © 2011-2022 走看看