Die ECMAScript Promise.all-Methode funktioniert mit jQuery.Deferred.Warum?
-
22-12-2019 - |
Frage
Ich habe nach Promises in JavaScript gesucht.Mich interessiert, ob ich ECMAScript Promises mit anderen Implementierungen kombinieren kann, zum Beispiel mit jQuery $.Deferred
.Und ich war überrascht, als Promises.all
funktioniert gut mit jQuery $.Deferred
.Ich versuche, die Antwort im jQuery-Quellcode und in den CommonJS Promises/A-Spezifikationen zu finden, aber ich habe immer noch falsch verstanden, warum dieser Code wie erwartet funktioniert (do console.log
nach 10 Sekunden, nicht nach 5 Sekunden):
var promise = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();//resolve first promise after 5 secs
console.log('Promise resolved');
}, 5000);
});
var deferred = $.Deferred();
setTimeout(function () {
deferred.resolve();//resolve after 10 seconds
console.log('Deferred resolved');
}, 10000);
Promise.all([promise,deferred]).then(function () {
console.log('All is done');//log after 10 seconds
});
Hast du eine Idee?
Promise.all
muss sich auf etwas Feld oder eine Methode verlassen $.Deferred
Zu verstehen ist, ob es gelöst ist oder nicht.Was ist diese Methode/dieses Feld?
Lösung
Die Promises-A+-Spezifikation (auf der die Promises-Unwrapping-Spezifikation basierte und welche nativen Promises verwendet werden) wurde speziell für diesen Zweck entwickelt.
Mit dem Designziel, dass Bibliotheken gut zusammenarbeiten, basiert die Spezifikation auf einer einzigen Methode: .then
.
Die then-Methode gibt an, wie eine Fortsetzung eines Versprechens funktioniert.jQuery verspricht Expose .then
seit Version 1.8, was bedeutet, dass sie versuchen, an diesem Spiel teilzunehmen.Während es bei jQuery Verzögerungen und Versprechen gibt nicht Versprechen/A+-Versprechen – sie versuchen, Versprechen/A-Versprechen zu sein, was Folgendes bedeutet:
return Promise.resolve($.get(...))
Wird immer funktionieren.A+-Versprechungen (und native Versprechungen) werden alle assimilieren .then
kann rekursiv ausgeführt und mit seinem Wert aufgelöst werden, wenn Sie ihn zurückgeben.
Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
console.log(el); // this logs 3
})
Wenn wir das überprüfen Spezifikation , wir sehen:
Lassen Ergebnis be Invoke(nächstes Versprechen,
"then"
, (auflösenElement, VersprechenFähigkeit.[[Ablehnen]])).
(auch verwandt ist Das)
Welche Anrufe .then
und löst dann das nächste Element auf .then
fähig löst
jQuerys Deferred verwendet eine nicht standardmäßige Promise-Implementierung, sodass es keine nativen Promises konsumieren kann (das heißt, Sie können es nicht vorhersehbar tun). $.when
ein einheimisches Versprechen.Andersherum funktioniert es.