2010年2月9日火曜日

JSDeferredを誤解。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
当たり前だけど、「chainのnextとそうでないnextは違う」ということです。debugを挿入して追ってみました。

prototypeのnext
  next  : function (fun) { 
    debug('Deferred.prototype.next');
    return this._post("ok", fun) 
  },

ブラウザ差異を吸収するためのモノのようなので、defaultのみをチェックする。
Deferred.next_default = function (fun) {
  debug('Deferred.next_default');
        var d = new Deferred();
        var id = setTimeout(function () { d.call() }, 0);
        d.canceller = function () { clearTimeout(id) };
        if (fun) d.callback.ok = fun;
        return d;
};

Deferred.next = Deferred.next_faster_way_readystatechange ||
                Deferred.next_faster_way_Image ||
                Deferred.next_default;

実行したテストコード
test('very simple tests for using jsdeferred with qunit.', function(){
  var x = 0;
  Deferred.define();
  next(function(){
    x = 2;
  })
  .next(function(){
    x = 1;
  })
  .next(function(){
    equals(x, 1);
    start();
  });
  stop(100);
});
これも当たり前だけど、グローバルに挿入されているinstanceのものが1回呼ばれた後、prototypeのほうが2回呼ばれます。設計意図を理解せねば。それからDeferred.prototype.fnとDeferred.fnの違いもわからないとだめだなぁ。var d = Deferred; d.fn()とDeferred.fn()は意味が違う。

0 件のコメント: