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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top