旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

旧VerでjQuery.Deferredが動かないケース

2012年11月28日

jQueryの旧バージョン(v1.7.2)でDeferredが正しく動かない場合があり
最新の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のリリースノート一覧
 多分どこかで直しているんですが、パッと見て見つからなかったので放置