Pregunta

Yo estaba haciendo una investigación para Promesas en JavaScript.Estoy fue muy interesante, puedo combinar ECMAScript Promesas con otras implementaciones, por ejemplo jQuery $.Deferred.Y me sorprendí cuando Promises.all funciona bien con jQuery $.Deferred.Estoy tratando de encontrar la respuesta en jQuery código fuente y CommonJS Promesas/A especificaciones, pero yo todavía mal entendido por qué este código funciona como se esperaba(¿ console.log después de 10 segundos, no de 5 segundos):

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
});

¿Tienes alguna idea?

Promise.all debe confiar en algo de campo o método de $.Deferred para entender de que se resuelva o no.¿Cuál es ese método/campo?

¿Fue útil?

Solución

Las promesas A+ especificación (en el que las promesas de abrir la especificación se basa en que las promesas de uso) fue especialmente construido para ello.

Con un objetivo de diseño de bibliotecas entre unirá así, la especificación está construido alrededor de un único método: .then.

El método then especifica cómo una continuación de una promesa obras.jQuery promete exponer .then desde la versión 1.8 que significa que se trate de participar en este juego.Mientras jQuery deferreds y promesas son no Promesas/A+ promesas - intentan ser Promesas/Una de las promesas que significa lo siguiente:

return Promise.resolve($.get(...))

Siempre va a funcionar.A+ promesas (y nativos de las promesas) que va a asimilar cada .thenpoder de forma recursiva y resolver con su valor cuando te la devuelva.

Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
    console.log(el); // this logs 3
})

Si comprobamos la especificación podemos ver:

Vamos resultado ser Invoke(nextPromise, "then", (resolveElement, promiseCapability.[[Rechazar]])).

(también se relaciona este)

Que llama .then y resuelve el siguiente elemento al que .thencapaz resuelve

jQuery diferido utiliza un no estándar de la promesa de implementación por lo que no puede consumir nativo promesas (Que es, usted no puede predecible $.when un nativo de la promesa.La otra manera alrededor de las obras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top