単一の引数を取る関数があります。Promise
この引数がjQueryなのかDeferred
オブジェクトなのかを見分ける必要があります。そうでない場合、値は任意のタイプであり、任意のプロパティを持っている可能性があるため、promiseメソッドが存在するだけでは安全ではありません。
関数をどのように動作させたいかの例を次に示します。
function displayMessage(message) {
if (message is a Promise or Deferred) {
message.then(displayMessage);
} else {
alert(message);
}
}
promiseの再帰的な処理に注意してください。promiseが表示されない別のpromise値で解決された場合、それが解決されるのを待ちます。さらに別の約束が返される場合は、繰り返します。
これが当てはまらない場合は、次を使用できるため、これは重要ですjQuery.when
。
function displayMessage(message) {
jQuery.when(message).then(function(messageString) {
alert(messageString);
});
}
これは、値と値の約束を正しく処理します...
displayMessage("hello"); // alerts "hello"
displayMessage(jQuery.Deferred().resolve("hello")); // alerts "hello"
...しかし、価値の約束の約束に達すると、それは崩壊します:
displayMessage(jQuery.Deferred().resolve(
jQuery.Deferred().resolve("hello")
)); // alerts "[object Object]"
jQuery.when
値が約束であるかどうかを知ることができるので、明らかにそれは可能です。どうすれば確認できますか?