• 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');
    })
  • 相关阅读:
    struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
    Wcf 双工通信的应用
    较完整的轮播图特效
    jQuery图片轮播的具体实现
    一种新的隐藏-显示模式诞生——css3的scale(0)到scale(1)
    你所不知的 CSS ::before 和 ::after 伪元素用法
    scale等比缩放才能做到看上去能让线条以中心点展开
    loading.io一个可以直接生成loading gif图标的站点
    按住ctrl键可以在新窗口打开图片
    背景图片等比缩放的写法background-size简写法
  • 原文地址:https://www.cnblogs.com/shidengyun/p/5338754.html
Copyright © 2020-2023  润新知