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?

War es hilfreich?

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 .thenkann 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 .thenfä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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top