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!

¿Fue útil?

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 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top