2012-04-27 16 views
8

Quando uso la funzione Ajax di JQuery e la risposta è abbastanza grande ~ 1 mb l'interfaccia viene congelata appena prima che venga chiamata la funzione di successo. Ho sperimentato questo con la funzione JSON.parse e l'analisi di una grande quantità di dati. Credo che questa funzione sia utilizzata sulla restituzione della richiesta per formattare il contenuto in JSON. Ecco il codice che sto usando.JQuery ajax si blocca quando la risposta è molto grande

$.ajax({ 
     url: "/sessions/" + this.get("session_id") + "/get_sample_data", 
     data: params, 
     dataType: 'json', 
     type: "GET", 
     success: function (response) { 
      success(response); 
     } 
    }); 

Esiste un modo per ignorare il codice per la risposta in modo da poter scaglionare l'analisi in parti e, auspicabilmente, ridurre al minimo il blocco sulla ui? o c'è un altro modo per risolvere questo problema. Sto usando cromo e cromo canarino e ottengo lo stesso risultato in entrambi.

Grazie in anticipo

+0

da dove viene il problema? in jQuery analizzando il JSON? o il tuo codice analizza il JSON? – Joseph

+0

1 MB di JSON? 1 MB di testo normale ??? Cosa stai cercando di visualizzare su una singola pagina web? Forse dovresti pensare troppo alla tua domanda! – Amberlamps

+1

@Amberlamps forse quello che intendevi era "ripensare"? Di solito vedo 1 MB o più quando carico le mappe dei giochi JSON o le mappe sprite codificate base64. È ragionevole, ma sì, a volte sono eccessivi. – Joseph

risposta

8

L'ipotesi è che l'analisi di un risposta JSON gigante è quello che causa il ritardo. Se questo è il caso, allora hai queste opzioni:

  1. Suddividere la risposta del server in più richieste.
  2. Interrompe l'analisi in più parti.
  3. Invia la risposta a un web worker e analizzala in un web worker (non funziona nei browser più vecchi).

Per spezzare l'analisi in più parti, si dovrebbe modificare la chiamata ajax jQuery per tornare solo il testo prima e che avrebbe dovuto creare il proprio JSON parser in grado di fare il lavoro in blocchi su setTimeout() in modo che l'interfaccia utente potesse rimanere in vita durante l'analisi. Questa sarebbe una quantità accettabile di lavoro. Presumo che tu inizi con un parser JSON esistente e quindi dovresti modificarlo per salvare il suo stato in modo che possa funzionare in blocchi.

Cambiare l'interfaccia con il server per recuperare pezzi di JSON è probabilmente il modo più semplice per risolvere il problema se è possibile modificare l'interfaccia nel server in modo appropriato.

Per alcune idee alternative su come elaborare grandi quantità di dati in blocchi, è possibile vedere Best way to iterate over an array without blocking the UI

Problemi correlati