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?

È stato utile?

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 .thenin 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 .thenin 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top