49

遅延オブジェクトを返すこともあれば、非遅延オブジェクトを返すこともある関数があるとします。それがどれであるかをどうやって見分けることができますか?

4

3 に答える 3

54

ユースケースによっては、jQuery.when[1]を使用することもできます。

単一の引数が渡されjQuery.when、それがDeferredでない場合、それは解決されたDeferredとして扱われ、アタッチされたdoneCallbacksはすぐに実行されます。

これにより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/

于 2012-08-28T14:03:09.300 に答える
30

jQuery Deferred は、関数で new 演算子を呼び出すのではなく、隠しオブジェクトのメソッドをコピーすることによって作成されるため、オブジェクトが実際に jQuery.Deferred のインスタンスであることを証明することはできません。ダックタイピングを使用する必要があると思います:

「アヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴く鳥を見るとき、私はその鳥をアヒルと呼びます。」– ジェームズ・ウィットコム・ライリー

それ以外の場合に返される可能性のあるオブジェクト (期待されるプロパティ) に応じて、特定のプロパティ/メソッドが存在するかどうかを確認します。

var x = getMysteriousObject();
if (x.promise) {
    // Deferred
} else {
    // Not a deferred
}

必要に応じて、このチェックを詳しく説明できます。

if ($.isFunction(x.promise)) {
    // Deferred
}

または (Deferred オブジェクトと Promise インターフェースの他の実装を区別するため)

if (x.promise && x.resolve) {
    // Deferred
}
于 2012-06-09T22:57:18.383 に答える