ECMAScript Promesse.toutes les méthode fonctionne avec jQuery.Différé.Pourquoi?
-
22-12-2019 - |
Question
Je faisais une recherche pour des Promesses en JavaScript.Je suis a été intéressant puis-je combiner ECMAScript Promesses avec d'autres implémentations, par exemple jQuery $.Deferred
.Et j'ai été surpris quand Promises.all
fonctionne très bien avec jQuery $.Deferred
.J'essaie de trouver la réponse en jQuery code source et de CommonJS Promesses/Un cahier des charges, mais j'ai encore mal compris pourquoi ce code fonctionne comme je m'y attendais(ne console.log
après 10 secondes, pas 5 secondes):
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
});
Avez-vous des idées?
Promise.all
doit s'appuyer sur quelque chose de champ ou d'une méthode de $.Deferred
comprendre, c'est résolu ou pas.Qu'est-ce que la méthode/de champ?
La solution
Les promesses d'Un+ spécification (sur lequel les promesses de déballage de spécification est basée sur des natifs qui promet d'utilisation) a été spécialement créé pour ce faire.
Avec un objectif de conception de bibliothèques inter-oping bien, le cahier des charges est construit autour d'une seule méthode: .then
.
La méthode spécifie comment une continuation d'une promesse de travaux.jQuery promet d'exposer .then
depuis la version 1.8 qui signifie qu'ils essaient de participer à ce jeu.Alors que jQuery deferreds et les promesses sont pas Promesses/A+ promet - ils tenter d'être des Promesses/A promesses qui signifie que les suivantes:
return Promise.resolve($.get(...))
Le sera toujours.A+ les promesses (et natif de promesses) va assimiler tous les .then
mesure de manière récursive et de résoudre avec sa valeur lorsque vous le retourner.
Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
console.log(el); // this logs 3
})
Si nous vérifions l' spécification nous pouvons voir:
Laissez résultat être Invoke(nextPromise,
"then"
, (resolveElement, promiseCapability.[[Rejeter]])).
(est aussi en lien avec cette)
Qui appelle .then
et les résout à l'élément suivant lorsque que .then
mesure résout
jQuery différés utilise un autre promesse de la mise en œuvre de sorte qu'il ne peut pas consommer natif de promesses (Qui est, vous ne pouvez pas prévisible $.when
un natif de la promesse.L'autre manière autour des œuvres.