У меня есть функция, которая принимает один аргумент. Мне нужно знать, является ли этот аргумент объектом jQuery Promise
или Deferred
. Если нет, то значение может быть любого типа и иметь любые свойства, поэтому оно небезопасно только для наличия методов обещаний.
Вот пример того, как я хочу, чтобы моя функция вела себя:
function displayMessage(message) {
if (message is a Promise or Deferred) {
message.then(displayMessage);
} else {
alert(message);
}
}
Обратите внимание на рекурсивную обработку promises: если обещание разрешено с другим значением обещания, мы его не видим, мы ждем его разрешения. Если он вернет еще одно обещание, повторите.
Это важно, потому что, если бы это было не так, я бы просто использовал jQuery.when
:
function displayMessage(message) {
jQuery.when(message).then(function(messageString) {
alert(messageString);
});
}
Это будет корректно обрабатывать значения и promises значений...
displayMessage("hello"); // alerts "hello"
displayMessage(jQuery.Deferred().resolve("hello")); // alerts "hello"
... но как только мы перейдем к promises из promises значений, он сломается:
displayMessage(jQuery.Deferred().resolve(
jQuery.Deferred().resolve("hello")
)); // alerts "[object Object]"
jQuery.when
может сказать, обещано ли значение, так что, по-видимому, это возможно. Как я могу проверить?