Как я могу определить, является ли объект 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 может сказать, является ли значение обещанием, так что, по-видимому, это возможно. Как я могу проверить?

Ответы на вопрос(2)

Ваш ответ на вопрос