2012-09-27 16 views
6

Sé que el caso de uso recomendado para Dojo Deferreds es usar dojo.when (def) o def.then() y proporcionar una devolución de llamada para cuando se resuelva el aplazado. Sin embargo, a veces me encuentro con una situación en la que realmente tengo que esperar a que se complete ese Deferred antes de continuar con el hilo actual. He aquí un ejemplo (ejemplo completo en http://jsfiddle.net/DG3Ax/2/)¿Cómo puedo bloquear hasta que se resuelva Dojo Deferred?

function getSomething() { 
    var def = getSomeDeferred(); 

    def.then(function(result) { 
     dojo.place("<li>def.then() = " + result + "</li>", "output"); 
    }); 

    return def.gimmeTheResultNow(); 
} 

dojo.place("<li>getSomething() = " + getSomething() + "</li>", "output"); 

Obviamente no existe Deferred.gimmeTheResultNow(), pero esa es la funcionalidad que estoy buscando. No tengo control del código llamando a getSomething(), así que no puedo hacer que maneje un Deferred; necesita el resultado real.

Sé que xhrGet() tiene un parámetro de sincronización que creo que haría el trabajo si se tratara de una llamada AJAX, pero ese no es necesariamente el caso. ¿Hay alguna otra forma de lograr esto?

+3

No sé lo que hace su diferido, pero parece que debería deshacerse de él. Los diferidos son para comportamientos asincrónicos sin bloqueo. – bfavaretto

Respuesta

4

tengo un very helpful answer de la lista de correo dojo-interés, por lo que pensé en lo pego aquí:

Por desgracia, no se puede hacer esto en el navegador.

JavaScript en el navegador tiene un solo subproceso. Si está sentado esperando a Detenido para resolver, entonces está usando ese hilo. Este es el mismo subproceso que se necesitará en algún lugar de la línea para atender una llamada a Deferred.resolve() (que, a su vez, daría como resultado una llamada a la función que pasó a .then()).

Puede llamar a xhr de forma síncrona porque la implementación base del XHR get le permite llamarla sincrónicamente. La funcionalidad de dojo/Deferred es solo una envoltura alrededor de las partes internas de XHR.

Cuestiones relacionadas