Ho una chiamata Ajax che al momento deve essere sincrona. Tuttavia, mentre questa chiamata Ajax è in esecuzione, l'interfaccia del browser si blocca fino a quando la chiamata non ritorna. In caso di timeout, questo può bloccare il browser per un significant period of time.È possibile ottenere una finestra del browser per l'aggiornamento mentre è in un ciclo di Javascript?
C'è un modo per ottenere il browser (qualsiasi browser) per aggiornare l'interfaccia utente, ma non eseguire alcun Javascript? Idealmente sarebbe un comando come window.update()
, che consentirebbe l'aggiornamento del thread dell'interfaccia utente.
Se ciò fosse possibile, allora potrei sostituire la chiamata AJAX sincrono con qualcosa di simile:
obj = do_async_ajax_call();
while (!obj.hasReturned()) {
window.update();
}
// synchronous call can resume
La ragione per cui non posso usare setTimeout
, o riprendere una funzione nella callback, è che il flusso di esecuzione non può essere interrotta: (ci sono troppe variabili di stato che tutti dipendono l'uno dall'altro, e il flusso long_function()
avrebbe altrimenti essere ripreso in qualche modo):
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;
}
Perché la chiamata deve essere sincrona? –
Puoi pubblicare l'intero codice di chiamata? Questo può probabilmente essere semplificato e utilizzare le funzioni XHR per supportare ciò che è necessario (a meno che jQuery non sia un'opzione, quindi ancora più pulito). Se nessuna delle due è un'opzione, ti chiedo di rinominare la funzione in 'do_sync_jax_call();' –