In jQuery $ .Deferred enthaltene Probleme (jQuery 1.x / 2.x)
@Domenic hat einen sehr gründlichen Artikel über die Schwächen von jQuery deferred-Objekte: Sie sind fehlt den Punkt der Verspricht. In es Domenic highlights ein paar Schwächen jQuery verspricht im Vergleich zu anderen, darunter Qwhen.js, RSVP.js und ES6 promises.
Gehe ich Weg von Domenic Artikel das Gefühl, dass jQuery verspricht eine inhärente scheitern, konzeptionell. Ich versuchte Beispiele zu dem Konzept.
Entnehme ich, es gibt zwei Probleme mit dem jQuery-Implementierung:
1. Die .then
Methode ist nicht verkettbare
In anderen Worten
promise.then(a).then(b)
jQuery rufen a
dann b
wenn die promise
erfüllt ist.
Seit .then
gibt ein neues Versprechen in die andere Versprechen Bibliotheken, deren äquivalent wäre:
promise.then(a)
promise.then(b)
2. Die Ausnahmebehandlung ist sprudelte in jQuery.
Dem anderen Problem zu sein scheint, Ausnahmebehandlung, nämlich:
try {
promise.then(a)
} catch (e) {
}
Den Gegenwert in Q wäre:
try {
promise.then(a).done()
} catch (e) {
//.done() re-throws any exceptions from a
}
In jQuery die Ausnahme und wirft Blasen, wenn a
scheitert an den catch-block. In den anderen verspricht jede Ausnahme in a
wäre, durchgeführt durch die .done
oder .catch
oder anderen asynchronen fangen. Wenn keines der Versprechen API-Aufrufe abfangen der Ausnahme, dass es verschwindet (daher der Q best-practice-z.B. mit .done
zu release werden alle nicht behandelten Ausnahmen).
Tun, die Probleme über Abdeckung, die Bedenken mit dem jQuery Umsetzung von Versprechen, oder habe ich das falsch verstanden oder verpasst Fragen?
Bearbeiten Diese Frage bezieht sich auf jQuery < 3.0; Stand jQuery 3.0 alpha jQuery ist Promises/A+ - kompatibel ist.
InformationsquelleAutor der Frage Brian M. Hunt | 2014-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update: jQuery 3.0 hat die Probleme gelöst, die nachfolgend umrissen. Es ist wirklich Promises/A+ - kompatibel ist.
Ja, jQuery Versprechungen ernst und inhärente Probleme.
Sagte, dass, seit der Artikel geschrieben wurde jQuery erhebliche Anstrengungen unternommen werden, um mehr Verspricht/Aplus Beschwerde-und Sie haben jetzt einen .dann die Methode, die Ketten.
Also auch in jQuery
returnsPromise().then(a).then(b)
für das Versprechen der Rückkehr Funktionena
undb
funktionieren wird, wie erwartet, Auspacken der Rückgabewert, bevor Sie weiter nach vorne. Wie dargestellt in diesem fiddle:Jedoch, die beiden riesige Probleme mit jQuery sind den Umgang mit Fehlern und unerwarteten Reihenfolge der Ausführung.
Fehlerbehandlung
Gibt es keine Möglichkeit, daneben ein jQuery-Versprechen, abgelehnt, da "Behandelt", auch wenn Sie das Problem beheben, im Gegensatz zu fangen. Dies macht Ablehnungen in jQuery inhärent kaputt und sehr schwer zu bedienen, nichts wie synchron
try/catch
.Können Sie erraten, was die logs hier? (fiddle)
Wenn Sie erraten
"uncaught Error: boo"
Sie richtig waren. jQuery Versprechen werfen nicht sicher. Sie lassen Sie nicht behandeln geworfen Fehlern im Gegensatz zu den Versprechungen/Aplus verspricht. Was ist mit Sicherheit ablehnen? (fiddle)Die folgenden Protokolle
"In Error Handler" "But this does instead"
- es gibt keinen Weg zu handle ein jQuery-Versprechen Ablehnung überhaupt. Dies ist im Gegensatz zu der Strömung, die Sie erwarten würden:Ist die Strömung, die Sie mit Promises/A+ - Bibliotheken wie Bluebird und Q, und das, was Sie erwarten würden, für den nutzen. Dies ist riesige und werfen Sie die Sicherheit ein großer Pluspunkt für verspricht. Hier ist Bluebird richtig zu handeln in diesem Fall.
Die Reihenfolge der Ausführung von
jQuery führt die übergebene Funktion sofortanstatt dies, wenn die zugrunde liegende Versprechen bereits gelöst, so dass code anders Verhalten, je nachdem, ob das Versprechen wir befestigen einen handler ein, der abgelehnt bereits gelöst. Dies ist effektiv die Freigabe Zalgo und kann dazu führen, dass einige der am meisten schmerzhaft bugs. Dies führt zu einigen der am schwierigsten zu debug-Fehler.
Wenn wir betrachten den folgenden code: (fiddle)
Können wir beobachten, dass die ach so gefährlichen Verhalten, die
setTimeout
wartet auf die original-timeout zu Ende, so jQuery schaltet seine Ausführung, um, weil... wer mag deterministisch-APIs, die nicht Ursache stack-overflows? Dies ist der Grund, warum der Promises/A+ - Spezifikation erfordert, dass die Versprechungen sind immer diese auf die nächste Ausführung der event-Schleife.Randnotiz
Erwähnenswert, dass neuere und stärkere Versprechen Bibliotheken, wie Bluebird (und experimentell, Wenn es nicht erforderlich
.done
am Ende der Kette wie F hat, da Sie herausfinden, unbehandelte Ablehnungen sich selbst, Sie sind auch viel viel schneller als jQuery verspricht oder Q verspricht.InformationsquelleAutor der Antwort Benjamin Gruenbaum