Как я могу определить, является ли объект 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)

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