旧VerでjQuery.Deferredが動かないケース
2012年11月28日
jQueryの旧バージョン(v1.7.2)でDeferredが正しく動かない場合があり
最新のv1.8.3にしたら直りました、という話
最新のv1.8.3にしたら直りました、という話
まぁ、更新すりゃいいんだけなんですが
わかるまで時間が掛かる不具合なのでメモっときます
新旧で挙動に差がでるコード
例えば以下のコードを実行した場合..
$.Deferred().resolve().then(function(){
    console.log(1);
}).then(function(){
    console.log(2);
    var d = $.Deferred();
    setTimeout(function(){ d.resolve(); }, 1000);
    return d;
}).then(function(){
    console.log(3);
    var d = $.Deferred();
    setTimeout(function(){ d.resolve(); }, 1000);
    return $.when(d.promise()).done(function(){
        console.log(3.5);
    });
}).then(function(){
    console.log(4);
});v1.8.3の正しい出力
1 2 3 3.5 4
v1.7.2の誤った出力
1 2 3 4 3.5
.. と、結果に差が出ます
原因は詳しくは追っていませんが
$.when から繋げると発生するみたいです
補足
実行環境は Google Chrome でした
      v1.7.2のテストページ
 JSコードはHTMLソースから
jQueryのリリースノート一覧
 多分どこかで直しているんですが、パッと見て見つからなかったので放置