/ / Welche Beziehung besteht zwischen Versprechungen, die von der Funktion chained .then () in AngularJS [duplicate] zurückgegeben wurden?

Was ist die Beziehung zwischen Versprechungen, die von der verketteten .then () - Funktion in AngularJS [Duplikat] zurückgegeben werden - Javascript, Angularjs, Versprechen, Kette

Alle:

Ich bin ziemlich neu bei Promise, bin nur neugierig, wie sie gelöst werden. Eines verwirrt mich:

Einige Beiträge zeigen mit

var defer = $q.defer();

// some logic block
{
// if success doing something
defer.resolve();
}
return defer.promise;

Wenn Sie jedoch die Funktion .then () verwenden, wird das Versprechen von .then (function () {}) zurückgegeben. Ich frage mich, wie ich steuern kann, ob dieses Versprechen aufgelöst wird oder nicht.

Eine weitere Verwirrung ist: Wenn ich welche verkettet benutze.Ich frage mich, wie die Beziehung zwischen ihnen aussieht, ob sie dasselbe Versprechungsobjekt sind, das gerade weitergegeben wurde, oder ob dann jede Funktion ein neues Versprechungsobjekt generiert und es zurückgibt.

Antworten:

1 für die Antwort № 1

Wie in diesem durchgehend und klar angegeben Dokument:

FRAGE 1. Ich frage mich, wie ich steuern kann, ob dieses Versprechen eingelöst wurde oder nicht.

Eine der Promise-APIs unterstützt spezielle Funktionen, die resolve() oder reject() ein Versprechen. Sie können also die folgenden Funktionen in Ihrem Code verwenden

var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…

if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});

Ablehnungen entstehen, wenn ein Versprechen explizit, aber auch implizit abgelehnt wird wenn ein Fehler im Konstruktor-Rückruf ausgelöst wird.

var jsonPromise = new Promise(function(resolve, reject) {
// JSON.parse throws an error if you feed it some
// invalid JSON, so this implicitly rejects:
resolve(JSON.parse("This ain"t JSON"));
});

jsonPromise.then(function(data) {
// This never happens:
console.log("It worked!", data);
}).catch(function(err) {
// Instead, this happens:
console.log("It failed!", err);
});

In anderen Varianten wird das Versprechen mit dem Rückgabewert aufgelöst, der an das nächste Glied in der Kette übergeben wird.

FRAGE 2.

Versprechen sind in gewissem Sinne Funktionen, die es werdenErgebnis in der Zukunft mit einem gewissen Wert. Der Ergebniswert ist der Rückgabewert von Versprechen - also sind Versprechen-Verkettungen (.then (...). Then ...) im Grunde eine Funktionskette, die wartet, bis das vorherige endet (Auflösung mit einem gewissen Wert). Dann werden sie mit einem Argument aufgerufen, das der Rückgabewert der zuletzt ausgeführten Funktion in der Warteschlange ist (vorheriges Glied in der Kette).

.then() Gibt ein neues Versprechungsobjekt zurück und ermöglicht so das Verketten. (siehe Bemerkung für Dokumentationslink)

ANMERKUNG

Es gibt eine große und eine kleine Beschreibung aller Angular-Versprechen in offizielle Dokumentation unter dem Abschnitt Promise API und nächste - Chaining the promises.


1 für die Antwort № 2

Dies ist kein Versuch, Versprechen in ihrer vollen Pracht zu erklären - es gibt Blogs dafür. Dies ist, um Ihre spezifischen Fragen zu beantworten:

Q1:

Aber wenn ich benutze .then() Funktion, Versprechen wird von zurückgegeben .then(function(){})Ich frage mich, wie ich steuern kann, ob dieses Versprechen erfüllt ist oder nicht.

Die Resolution-Handler-Funktion von .then steuert, wie dieses Versprechen erfüllt wird:

  1. Wenn die Handlerfunktion einen Wert zurückgibt, der kein Versprechen ist, wird das Versprechen mit diesem Wert aufgelöst.
var thenPromise = originalPromise.then (Funktionserfolg () { return "foo"; });  thenPromise.then (Funktion (Daten) { console.log (Daten); // "foo" });
  1. Wenn die Handler-Funktion ein anderes Versprechen zurückgibt, wird das .then Das Versprechen wird genau so aufgelöst, wie das neue Versprechen aufgelöst (oder abgelehnt) würde.
var thenPromise = originalPromise.then (function () { return $ timeout (function () {return "foo";}, 1000); });  thenPromise.then (Funktion (Daten) { console.log (Daten); // (nach 1 Sekunde) "foo" });
  1. Wenn die Handler-Funktion eine Ausnahme auslöst oder wenn die Rückgabe ein explizit abgelehntes Versprechen ist: `$ q.reject:
var thenPromise = originalPromise.dann (function () { return $ q.reject ("irgendein Fehler"); });  thenPromise.then (Funktion (Daten) { console.log (Daten); // kommt hier nicht an }) .catch (function (err) { console.log (err); // "Irgendein Fehler" });

Q2:

Wenn ich etwas angekettet benutze .then() Funktion, ich frage mich, was ist die Beziehung zwischen ihnen, sind sie das gleiche Versprechen Objekt, das nur weitergegeben wird oder jeder .then generiert ein neues Promise-Objekt und gibt es zurück?

Jeder .then erzeugt sein eigenes Versprechen.

var timeoutPromise = $ timeout (afterTimeout, 1000); var thenPromise = timeoutPromise.then (etwas tun); var anotherThenPromise = timeoutPromise.then (doSomethingElse);

Ob timeoutPromise löst dann beide auf doSomething und doSomethingElse würde ausführen und abhängig von ihrem Ergebnis thenPromise und anotherThenPromise hätten ihre jeweiligen Vorsätze.