Как я могу определить, является ли объект jQuery Promise / Deferred?
У меня есть функция, которая принимает один аргумент. Мне нужно быть в состоянии сказать, является ли этот аргумент jQueryPromise
или жеDeferred
объект. Если нет, то значение может быть любого типа и иметь любые свойства, поэтому небезопасно просто наличие методов обещания.
Вот пример того, как я хотел бы, чтобы моя функция работала:
function displayMessage(message) {
if (message is a Promise or Deferred) {
message.then(displayMessage);
} else {
alert(message);
}
}
Обратите внимание на рекурсивную обработку обещаний: если обещание разрешается с другим значением обещания, мы его не отображаем, мы ждем его разрешения. Если он возвращает еще одно обещание, повторите.
Это важно, потому что если бы это было не так, я бы просто мог использовать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
может сказать, является ли значение обещанием, так что, по-видимому, это возможно. Как я могу проверить?