la sintaxis de Jquery.diferido , lo sincrónico de devolución de función promesa
-
11-12-2019 - |
Pregunta
Una pregunta rápida sobre cómo usar Jquery.diferido a hacer un lento sincrónico de la función de devolución de una promesa en su lugar.Lo que he hecho hasta ahora es este :
function sayIt(ms) {
setTimeout( function() { console.log('what I say'); }, ms);
}
function doIt() {
return $.Deferred( function() { sayIt(2000); }).promise();
}
doIt().then( function() { console.log('ah'); });
el sayIt(2000) siempre va a través, pero el encadenado de la función después de la 'entonces' nunca incendios.
Si hago esto :
doIt().then( console.log('ah'));
el 'ah' viene de inmediato y, a continuación, el "qué digo" 2000ms más tarde - lo que quiero es, por supuesto, lo contrario, que después de dos segundos me dan lo que yo digo " y, a continuación, 'ah' justo después.
Cualquier sugerencia apreciado!
Solución
Para hacer algo de forma sincrónica, pero todavía uso una promesa, hacer:
function slowPromise() {
var def = $.Deferred();
// do something slow and synchronous
...
// resolve the deferred with the result of the slow process
def.resolve(res);
// and return the deferred
return def.promise();
}
El efecto es que usted todavía consigue una promesa, sino que la promesa ya está resuelto, por lo que cualquier .then()
que posteriormente registrada es el producto de inmediato.
La ventaja de este modelo es que si, a continuación, reemplace el código sincrónico con algo asincrónico de la función todavía tiene la misma interfaz externa.
Otros consejos
Si desea ejecutar una función después de que el tiempo de espera ha caducado, deberá llamar a resolve()
en el Deferred
objeto desde dentro de la caducidad de tiempo de espera de la función:
function sayIt(ms) {
var d = $.Deferred();
setTimeout(function() {
console.log('what I say');
d.resolve()
}, ms);
return d;
}
De esta forma se restringe la resolución de la Deferred
objeto de la expiración del tiempo de espera.
Para lograr lo que yo creo es su intención:
function doIt() {
return sayIt(2000).promise()
}
El .promise()
la llamada es opcional.Sólo restringe la interfaz disponible para las personas que llaman:por la devolución de un Promise
en lugar de la original Deferred
objeto, la persona que llama sólo puede reaccionar a los eventos, pero no el desencadenamiento de ellos.Referencia: http://api.jquery.com/deferred.promise/.
Finalmente, su llamada original:
doIt().then( function() { console.log('ah'); });
De salida será:
// 2 seconds delay
what I say
ah