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ć?