Ruby's Louvre

每天学习一点点算法

导航

解读JSDeferred源码4

      window.onload = function(){
        var o = {};
        Deferred.define(o);
        o.func = function(){alert(1); return this;}
        var print = function(a){
          alert(a)
        }
        Deferred.parallel([ // 配列かハッシュのどちらかで渡す
          /* 使い方 1 : Deferred.next を定義したオレオレオブジェクトを渡す */
          o.func()
          /* 使い方 2 : Deferred チェーンを渡す */
          ,Deferred.next( function(){ alert(2) } )
          ,Deferred.wait(1).next( function(){ alert(3) } )
          ,Deferred.call(print, 4)
          /* 使い方 3 : 新しい Deferred インスタンスを作ってそれを渡す */
          ,(function(){
            var d = new Deferred();
            setTimeout(function(){
              alert(5);
              d.call();  // ← ここで call することで遅延チェーンが繋がる
            },2000);
            return d;
          })()
        ])
        .next(function(){ // もちろん Deferred チェーンを繋げることができる。
          alert(6);
        });
      }
Deferred.parallel = function (dl) {
    if (arguments.length > 1) dl = Array.prototype.slice.call(arguments);
    var ret = new Deferred(), values = {}, num = 0;
    for (var i in dl) if (dl.hasOwnProperty(i)) (function (d, i) {
       
        if (typeof d == "function")d = next(d);
        d.next(function (v) {
            values[i] = v;
            if (--num <= 0) {
                if (dl instanceof Array) {
                    values.length = dl.length;
                    values = Array.prototype.slice.call(values, 0);
                }
                ret.call(values);
            }
        }).error(function (e) {
            ret.fail(e);
        });
        num++;
    })(dl[i], i);

    if (!num) Deferred.next(function () {//链结下一个Deferred链
        ret.call()
    });
    ret.canceller = function () {
        for (var i in dl) if (dl.hasOwnProperty(i)) {
            dl[i].cancel();
        }
    };
    return ret;
};

posted on 2010-04-20 15:02  司徒正美  阅读(169)  评论(0编辑  收藏  举报