Tengo una llamada Ajax que actualmente necesita ser sincrónica. Sin embargo, mientras se ejecuta esta llamada Ajax, la interfaz del navegador se congela, hasta que la llamada regrese. En casos de tiempo de espera, esto puede congelar el navegador para un significant period of time.¿Es posible obtener una ventana del navegador para actualizar mientras está en un bucle de Javascript?
¿Hay alguna manera de obtener el navegador (cualquier navegador) para actualizar la interfaz de usuario, pero no ejecutar ningún Javascript? Idealmente, sería algún comando como window.update()
, que permitiría actualizar la cadena de usuario.
Si esto no sería posible, entonces yo podría sustituir a la llamada AJAX sincrónica con algo como:
obj = do_async_ajax_call();
while (!obj.hasReturned()) {
window.update();
}
// synchronous call can resume
La razón por la que no puedo usar setTimeout
, o reanudar una función en la devolución de llamada, es que el flujo de ejecución no se puede interrumpir: (hay demasiadas variables de estado que todos dependen unos de otros, y el flujo long_function()
otra manera tendrían que ser reanudado de alguna manera):
function long_function() {
// lots of code, reads/writes variable 'a', 'b', ...
if (sync_call_is_true()) {
// lots of code, reads/writes variable 'a', 'b', ...
} else {
// lots of code, reads/writes variable 'a', 'b', ...
}
// lots of code, reads/writes variable 'a', 'b', ...
return calculated_value;
}
¿Por qué la llamada debe ser sincrónica? –
¿Puedes publicar el código de la llamada completa? Esto probablemente puede simplificarse y usar las funciones XHR para respaldar lo que necesita (a menos que jQuery sea una opción, y luego incluso más limpio). Si ninguno es una opción, le pido que cambie el nombre de la función a 'do_sync_jax_call();' –