Heim > Web-Frontend > js-Tutorial > 6 Merkmale der asynchronen JavaScript-Programmierung Versprechen mode_javascript-Fähigkeiten

6 Merkmale der asynchronen JavaScript-Programmierung Versprechen mode_javascript-Fähigkeiten

WBOY
Freigeben: 2016-05-16 16:53:35
Original
995 Leute haben es durchsucht

Bevor wir mit der formellen Einführung beginnen, möchten wir sehen, wie Javascript Promise aussieht:

Kopieren Sie den Code Der Code ist wie folgt:

var p = new Promise(function(resolve, ablehn) {
discover("hello world");
});

p. then(function(str ) {
alarm(str);
});

1 Was ist der Unterschied zwischen den folgenden beiden Codeteilen?

Code kopieren Der Code lautet wie folgt:
// Anlage A
var p = neues Versprechen (/*...*/);
p.then(func1);
p.then(func2);

// Anlage B
var p = neu Promise(/ *...*/);
p.then(func1)
.then(func2);
Wenn Sie die beiden oben genannten Codeteile ernst nehmen, dann ist Promises genau das Richtige ein eindimensionales Array von Rückruffunktionen. Dies ist jedoch nicht der Fall. Jeder then()-Aufruf gibt ein gespaltenes Versprechen zurück. Wenn daher in Anlage A func1() eine Ausnahme auslöst, wird func2() immer noch normal aufgerufen.
Wenn func1() in ExhibitB einen Fehler auslöst, wird fun2() nicht aufgerufen, da der erste Aufruf ein neues Versprechen zurückgibt, das in func1() abgelehnt wird. Das Ergebnis ist, dass func2() übersprungen wird.

Zusammenfassung: Versprechen können in mehrere Pfade aufgeteilt werden, ähnlich wie bei komplexen Flussdiagrammen.

2. Rückruf sollte das Ergebnis liefern

Welche Warnung erhalten Sie, wenn Sie den folgenden Code ausführen?


Code kopieren Der Code lautet wie folgt:
var p = new Promise(function(resolve , ablehnen) {
discover("hello world");
});

p.then(function(str) {})
.then(function(str) {
warning (str);
});
Der Alert im zweiten then() zeigt nichts an. Dies liegt daran, dass die Callback-Funktion im Kontext des Versprechens keine Callback-Funktion hat, da sich das Ergebnis ändert. Das Versprechen erwartet, dass Ihre Rückruffunktion dasselbe Ergebnis oder ein Ersatzergebnis zurückgibt, das dann an die nächste Rückruffunktion übergeben wird.
Verwenden Sie auf ähnliche Weise adpater, um die Ergebnisse wie folgt zu ändern:


Kopieren Sie den Code Der Code lautet wie folgt:
var FeetToMetres = function(ft) { return ft*12*0.0254 };

var p = new Promise(/*...*/);

p .then(feetToMetres)
.then(function(meters) {
warning(meters);
});
3. Es können nur Ausnahmen aus der oberen Ebene abgefangen werden
Was ist der Unterschied zwischen diesen beiden Codeteilen?


Code kopieren Der Code lautet wie folgt:
// Anlage A
neues Versprechen (Funktion( auflösen, ablehnen) {
auflösen("hello world");
})
.then(
function(str) {
throw new Error("uh oh") ;
},
undefiniert
)
.then(
undefiniert,
function(error) {
warning(error);
}
);

// Anlage B

neues Versprechen(funktion(auflösen, ablehnen) {
auflösen("Hallo Welt");
})
.then(
Funktion(str) {
throw new Error("uh oh");
},
function(error) {
warning(error);
}
);

in Im ersten Teil des Codes wird die im ersten then() ausgelöste Ausnahme vom zweiten then() abgefangen und dann die „uh oh“-Warnung ausgelöst. Daraus folgt, dass nur Ausnahmen der vorherigen Ebene abgefangen werden.
Im zweiten Teil des Codes befinden sich die Rückruffunktion und die Fehlerrückruffunktion auf derselben Ebene, was bedeutet, dass eine im Rückruf ausgelöste Ausnahme nicht abgefangen wird. Tatsächlich wird der Fehlerrückruf im zweiten Code nur ausgelöst, wenn das Versprechen abgelehnt wird oder das Versprechen selbst fehlschlägt

4. Fehler können behoben werden

Wenn Sie in einer Fehlerrückruffunktion den Fehler nicht erneut auslösen, geht das Versprechen davon aus, dass Sie den Fehler behoben haben, und kehrt zum gelösten Zustand zurück. Im nächsten Beispiel wird „ich bin gerettet“ angezeigt, da der Fehlerrückruf im ersten then() die Ausnahme nicht erneut ausgelöst hat.


Code kopieren Der Code lautet wie folgt:

var p = new Promise(function(resolve, ablehn) {
reject(new Error("pebkac"));
});

p.then(
undefiniert,
function(error) { }
)
.then(
function(str) {
warning("Ich bin gerettet!");
},
function(error) {
warning("Bad computer!");
}
);

Promise kann man sich wie Schichten auf einer Zwiebel vorstellen. Jedes then() fügt der Zwiebel eine weitere Schicht hinzu. Jede Ebene stellt eine Aktivität dar, die verarbeitet wird. Wenn eine Schicht endet, gilt das Ergebnis als repariert und bereit für die nächste Schicht.

5. Versprechen können pausiert werden

Nur ​​weil Sie bereit sind, eine then()-Methode auszuführen, heißt das nicht, dass Sie nicht pausieren und andere vorzeitig ausführen können. Um das aktuelle Versprechen anzuhalten oder auf den Abschluss eines anderen Versprechens warten zu lassen, geben Sie einfach ein weiteres Versprechen in then() zurück.

Code kopieren Der Code lautet wie folgt:

var p = new Promise(/*. ..* /);

p.then(function(str) {
if(!loggedIn) {
return new Promise(/*...*/);
}
})
.then(function(str) {
warning("Done.");
})

Im vorherigen Code wird die Eingabeaufforderung erst angezeigt Neues Versprechen ist gelöst. Dies ist eine praktische Möglichkeit, mehr Abhängigkeiten in einen vorhandenen asynchronen Codepfad einzuführen. Beispielsweise stellen Sie möglicherweise fest, dass die Sitzung des Benutzers abgelaufen ist, und Sie möchten möglicherweise eine zweite Anmeldung initialisieren, bevor Sie mit dem vorherigen Codepfad fortfahren.

6. Aufgelöste Versprechen werden nicht sofort ausgeführt

Erhalte ich eine Eingabeaufforderung, wenn ich den folgenden Code ausführe?

Code kopieren Der Code lautet wie folgt:

function runme() {
var i = 0 ;

new Promise(function(resolve) {
discover();
})
.then(function() {
i = 2;
});
warning(i);
}

Da das Promise sofort aufgelöst wird und die then()-Methode sofort ausgeführt wird, könnte man meinen, dass Prompt 2 erkannt wird. Die Versprechensdefinition erfordert jedoch, dass alle Aufrufe asynchron erzwungen werden. Daher wird die Eingabeaufforderung vor der Änderung generiert.
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage