LoginSignup
2
2

More than 5 years have passed since last update.

DeferredオブジェクトのNullオブジェクトを作る

Posted at

jQueryでDeferredオブジェクトをゴリゴリ作ってると、時々DeferredのNullオブジェクトが欲しくなる。
JavaScriptはダックタイピングな言語なので、単純にDeferredオブジェクトのインターフェース持ったオブジェクト作ればいいと思う。

$.extend({
    nullDeferred: (function(){
        function returnThis(){ return this; }

        var promise = {};

        // 基本はメソッドチェーンできるメソッドなので、自身を返すメソッドを生やす
        for(var n in $.Deferred().promise()){
            promise[n] = returnThis;
        }
        // 例外的にその他オブジェクトを返すメソッドを決め打ちで生やす
        $.extend(promise, {
            state: function(){ return ''; },
            then: function(){ return promise; },
            promise: function(){ return promise; }
        });

        var deferred = {};

        for(var n in $.Deferred()){
            deferred[n] = returnThis;
        }
        // deferred にも例外のメソッドを生やす
        $.extend(deferred, promise);

        return function(){ return deferred; };
    }())
});

バージョンアップでAPI変わったらどうしようかな。。。

なにはともあれ、これでメソッドチェーンを切らずに不要なコールバックを虚空の彼方へ飛ばせる。

$.nullDeferred()
    .done(function(){ console.log('アリアハンへ ようこそ!'); });
    .resolve(); // へんじがない、ただの Null オブジェクトのようだ。

ちなみに、$.whenの引数にこのNullオブジェクトが含まれていると、成功時のコールバックが呼ばれなくなるので要注意。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2