Woran erkenne ich, ob es sich bei einem Objekt um ein jQuery Promise / Deferred handelt?

Ich habe eine Funktion, die ein einziges Argument akzeptiert. Ich muss in der Lage sein zu erkennen, ob dieses Argument eine jQuery istPromise oderDeferred Objekt. Ist dies nicht der Fall, kann der Wert von einem beliebigen Typ sein und beliebige Eigenschaften haben. Daher ist es nicht sicher, nur die Versprechungsmethoden zu berücksichtigen.

Hier ist ein Beispiel, wie sich meine Funktion verhalten soll:

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

Beachten Sie die rekursive Behandlung von Versprechungen: Wenn eine Versprechung mit einem anderen Versprechungswert aufgelöst wird, wird dieser nicht angezeigt. Wir warten darauf, dass er aufgelöst wird. Wenn es ein weiteres Versprechen gibt, wiederholen Sie es.

Das ist wichtig, denn wenn das nicht der Fall wäre, könnte ich es nur benutzenjQuery.when:

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

Dies würde mit Werten und Wertversprechen richtig umgehen ...

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

... aber sobald wir Versprechen von Wertversprechen bekommen, bricht es zusammen:

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

jQuery.when kann sagen, ob ein Wert ein Versprechen ist, also ist es anscheinend möglich. Wie kann ich überprüfen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage