場合によっては遅延オブジェクトを返すが、場合によっては非遅延オブジェクトを返す関数がある場合。それがどれであるかはどうすればわかりますか?
ユースケースによっては、jQuery.when
[1]を使用することもできます。
単一の引数が
jQuery.when
に渡され、それがDeferredではない場合、その引数は解決されたDeferredとして扱われ、アタッチされたすべてのdoneCallbackがすぐに実行されます。
jQuery.when
を使用すると、不可思議なオブジェクトを常に据え置きとして扱うことができます。
// x could be a deferred object or an immediate result
var x = getMysteriousObject();
// success will be called when x is a deferred object and has been resolved
// or when x is an immediate result
jQuery.when( x ).then( success, error );
JQuery Deferredは、関数でnew演算子を呼び出す代わりに、非表示のオブジェクトのメソッドをコピーすることによって作成されるため、オブジェクトが実際にjQuery.Deferredのインスタンスであることを証明することはできません。あなたはダックタイピングに行く必要があると思う:
「アヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴く鳥を見ると、その鳥をアヒルと呼びます。」 – James Whitcomb Riley
他の方法で返される可能性のあるオブジェクト(どのプロパティが期待される必要があるか)に応じて、特定のプロパティ/メソッドが存在するかどうかを確認します。
var x = getMysteriousObject();
if (x.promise) {
// Deferred
} else {
// Not a deferred
}
必要に応じて、このチェックの詳細を確認できます。
if ($.isFunction(x.promise)) {
// Deferred
}
または(据え置きオブジェクトとPromiseインターフェースの他の実装を区別するため)
if (x.promise && x.resolve) {
// Deferred
}
ニコの答え に触発されて、オブジェクトがそのプロパティの名前だけでなくに基づいて延期されているかどうかをチェックする別の実装を作成しました-)それらのプロパティの内容について。私の他のオブジェクトがpromiseという名前のプロパティを持っていたので、私はそうしなければなりませんでした。
if (typeof value.resolve !== "function") {
return false;
}
return String(value.resolve) === String($.Deferred().resolve);