Jak mogę stwierdzić, czy obiekt jest jQuery Promise / Deferred?

Mam funkcję, która przyjmuje pojedynczy argument. Muszę być w stanie stwierdzić, czy ten argument jest jQueryPromise lubDeferred obiekt. Jeśli nie, to wartość może być dowolnego typu i mieć dowolne właściwości, więc nie jest to bezpieczne tylko dla obecności metod obietnicy.

Oto przykład, jak chciałbym, aby moja funkcja się zachowywała:

function displayMessage(message) {
  if (message is a Promise or Deferred) {
    message.then(displayMessage);
  } else {
    alert(message);
  }
}

Zwróć uwagę na rekurencyjne obchodzenie się z obietnicami: jeśli obietnica zostanie rozwiązana za pomocą innej wartości obietnicy, nie wyświetlamy jej, czekamy, aż zostanie rozwiązana. Jeśli zwróci kolejną obietnicę, powtórz.

Jest to ważne, ponieważ gdyby tak nie było, byłbym w stanie użyćjQuery.when:

function displayMessage(message) {
  jQuery.when(message).then(function(messageString) {
    alert(messageString);
  });
}

To poprawnie obsługiwałoby wartości i obietnice wartości ...

displayMessage("hello");                            // alerts "hello"
displayMessage(jQuery.Deferred().resolve("hello")); // alerts "hello"

... ale kiedy dotrzemy do obietnic obietnic wartości, załamuje się:

displayMessage(jQuery.Deferred().resolve(
  jQuery.Deferred().resolve("hello")
));                                                 // alerts "[object Object]"

jQuery.when jest w stanie stwierdzić, czy wartość jest obiecująca, więc najwyraźniej jest to możliwe. Jak mogę sprawdzić?

questionAnswers(2)

yourAnswerToTheQuestion