Pregunta

He leído algunas de las otras preguntas relacionadas ( Patrón para envolver una función de JavaScript asíncrono para hacerlo sincrónico & amp; Sincronizar eventos asíncronos en JavaScript & amp; puede haber más), pero solo quiero estar seguro de agotar todas las posibilidades.

¿Podría ser posible " convertir " un XmlHttpRequest asíncrono en uno casi sincrónico usando setInterval o setTimeout?

La idea es que, cuando la solicitud de Ajax sea exitosa, se establecerá una variable, que será la señal para un bucle while (que ha llamado setInterval o setTimeout, y una función de devolución de llamada según corresponda) para salir. ¿O estoy malinterpretando fundamentalmente las capacidades (o limitaciones) de setInterval y / o setTimeout?

¿Fue útil?

Solución

Es cierto, no desea utilizar setInterval y setTimeout de la forma que ha descrito. Lo que realmente quiere hacer es sentirse cómodo con las funciones anidadas, donde puede escribir de forma más o menos sincrónica.

Por ejemplo:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

Si bien puede usar setInterval y / o setTimeout (con llamadas a setTimeout nuevamente en el cuerpo de la función) para " sondear " para un código de éxito, ese enfoque es dramáticamente inferior a solo manejar el callback en primer lugar en lugar de sondearlo. Introduce la latencia, se escapa con la CPU y no se escala en múltiples solicitudes de XHR, por mencionar algunas deficiencias.

XHR llamará a tu función cuando finalice, tiene poco sentido ejecutar una función que pregunte " ¿Ya terminamos? ¿Ya hemos terminado? & Quot; mientras tanto. Por otro lado, si hay algún comportamiento periódico que desee BLOQUEAR hasta que la respuesta regrese (una parte de la animación que necesita que se ejecuten los datos, por ejemplo), es totalmente aceptable rodear el código de bloqueo en una sentencia if:

var tick = window.setTimeout(tock, 20);
var tock = function()
{
   if (response_done)
   {
      // dependent code
   }
   tick = window.setTimeout(tock, 20);
}
XHR.get(your_data, function() { /*Handle response*/ response_done = true; });

Otros consejos

Si estoy respondiendo correctamente a tu pregunta, podrías lograr un efecto similar con el siguiente código:

var computationInterval =
    window.setInterval(function() {
        // do a computation cycle, as if you're in the body of a while loop
    }, 100);

$.get('http://example.com/areWeThereYet', function() {
    // break the intervals (the pseudo-cycle)
    window.clearInterval(computationInterval);
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top