ECMAScript Promessa.tutti metodo funziona con jQuery.Differite.Perché?
-
22-12-2019 - |
Domanda
Stavo facendo una ricerca per Promesse in JavaScript.Io sono stata interessante posso combinare ECMAScript Promesse con altre implementazioni, per esempio jQuery $.Deferred
.E sono rimasto sorpreso quando Promises.all
funziona bene con jQuery $.Deferred
.Sto cercando di trovare la risposta in jQuery codice sorgente e CommonJS Promesse, Un specs, ma ho ancora frainteso perché questo codice funziona come mi aspettavo(non console.log
dopo 10 secondi, 5 secondi):
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
});
Avete idee?
Promise.all
deve fondarsi su qualcosa di campo o il metodo di $.Deferred
per capire è risolto o no.Che cosa è che il metodo/campo?
Soluzione
Le promesse di Un+ specifica (in cui le promesse di svolgimento delle specifiche sulla base della quale il nativo promesse uso) è stato appositamente costruito per fare questo.
Con un obiettivo di progettazione di biblioteche inter-oping bene, la specifica è costruito intorno a un unico metodo: .then
.
Il metodo poi specifica come una continuazione di una promessa opere.jQuery promesse esporre .then
a partire dalla versione 1.8 che significa che si tenta di partecipare a questo gioco.Mentre jQuery deferreds e le promesse sono non Promesse/A+ promesse - tentano di essere Promesse/A promesse che significa il seguente:
return Promise.resolve($.get(...))
Funziona sempre.Un+ promesse (e nativo promesse) adotterà ogni .then
in grado in modo ricorsivo e risolvere con il suo valore quando si torna.
Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
console.log(el); // this logs 3
})
Se andiamo a vedere la specifica possiamo vedere:
Lasciate risultato essere Invoke(nextPromise,
"then"
, (resolveElement, promiseCapability.[[Rifiuta]])).
(anche correlati questo)
Che chiama .then
e risolve l'elemento successivo quando .then
in grado di risolve
jQuery differita usi non standard promessa di attuazione in modo da non consumare nativo promesse (Che è, non si può non prevedibile $.when
un nativo promessa.L'altro modo intorno lavori.