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オブジェクトが含まれていると、成功時のコールバックが呼ばれなくなるので要注意。