web-dev-qa-db-ja.com

jQueryオブジェクトが延期されているかどうかを確認するにはどうすればよいですか?

場合によっては遅延オブジェクトを返すが、場合によっては非遅延オブジェクトを返す関数がある場合。それがどれであるかはどうすればわかりますか?

48
WawaBrother

ユースケースによっては、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 );

[1] http://api.jquery.com/jQuery.when/

54
Julian Maicher

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
}
30
Niko

ニコの答え に触発されて、オブジェクトがそのプロパティの名前だけでなくに基づいて延期されているかどうかをチェックする別の実装を作成しました-)それらのプロパティの内容について。私の他のオブジェクトがpromiseという名前のプロパティを持っていたので、私はそうしなければなりませんでした。

if (typeof value.resolve !== "function") {
  return false;
}
return String(value.resolve) === String($.Deferred().resolve);
1
The_Black_Smurf