2012-04-14 21 views
24

Ho sviluppato alcuni siti Web e inciampo sempre nello stesso punto: più chiamate ajax. Ho una pagina principale in cui tutto il contenuto viene caricato in modo asincrono. Quando la pagina è caricata, ci sono quattro chiamate INDEPENDENT che "disegnano" la pagina per aree (in alto, a sinistra, a destra e in basso) e mentre è caricata mostro all'utente i tipici giri di ajax. Quindi, quando una richiesta viene ricevuta dal browser, eseguo il callback e le diverse aree vengono disegnate in momenti diversi. Il fatto è che la risposta per il server a volte è confusa, voglio dire, la risposta di top è disegnata a sinistra o viceversa.Chiamate ajax multiple allo stesso tempo

Ho provato alcune soluzioni come la creazione di un timestamp in ogni richiesta per indicare al browser e al server che ogni richiesta è diversa.

Inoltre, ho provato a configurare alcuni parametri della cache nel server, nel caso.

L'unico modo in cui funziona è stato incluso il request2 nel callback di colui, ecc

qualcuno conosce il modo corretto di farlo o mai ha battuto questo problema ?? Non voglio fare richiesta concatenata.

Grazie

Ecco un esempio di ciò che intendo:

$(document).ready(function() { 

$.get('/activity',Common.genSafeId(),function(data){$('#stream').html(data);$("#load_activity").addClass("empty");}); 
$.get('/messages',Common.genSafeId(),function(data){$('#message').html(data);$("#load_messages").addClass("empty");}); 
$.get('/deals',Common.genSafeId(),function(data){$('#new_deals_container').html(data);$("#load_deal").addClass("empty");}); 
$.get('/tasks',Common.genSafeId(),function(data){$('#task_frames').html(data);$("#load_task").addClass("empty");});}); 

E l'HTML è un semplice jsp con quattro contenitori ognuno con un differente id.

+3

Cosa vuoi dire, la risposta è disegnata nel posto sbagliato? Costruito correttamente, la chiamata Ajax aggiornerà una parte molto specifica dell'HTML che si trova in una posizione molto specifica nel layout. Pubblica un semplice codice che mostri il problema. –

+0

Stai aggiungendo il contenuto alla tua pagina con qualcosa come $ ('# contenitore'). Append()? – jimw

+0

Sì, ho aggiornato il post. Il contenuto viene aggiunto al DOM, ma a volte la richiesta disegna il contenuto in un id inappropriato. So che è strano, per questo motivo di solito faccio la richiesta della catena. Grazie per entrambe le risposte. –

risposta

-5

Assicurati di avere richiamate diverse per ogni chiamata Ajax, sembra che tu stia cercando di utilizzare la stessa funzione per tutti e quattro, quindi quando vengono chiamati fuori servizio (perché richiedono diverse quantità di tempo sul lato server) , stanno rendendo nel posto sbagliato. Se insisti a utilizzare la stessa funzione per tutte le tue callback, devi inserire qualcosa nel payload in modo che il callback sappia dove eseguire il rendering.

+2

Separare le funzioni non è il modo di avvicinarsi a questo. È abbastanza semplice mantenere un valore in una chiusura, per determinare dove dovrebbe andare la risposta. –

+0

True Beetroot-Beetroot, ma scommetto che non sta usando jQuery. –

+3

Chi dice che hai bisogno di jQuery per chiudere? –

39

TAPPI

Closures sono un po 'mente-blowing all'inizio. Sono una caratteristica di javaScript e di molti altri linguaggi informatici moderni.

Una chiusura è formata da un'istanza eseguita di una funzione che ha una funzione interna (in genere un gestore di eventi anonimo o un metodo denominato) che deve accedere a una o più variabili esterne (cioè variabili che si trovano all'interno della funzione esterna ma al di fuori della funzione interiore). La cosa sconvolgente è che la funzione interna mantiene l'accesso alle variabili esterne anche se la funzione esterna è stata completata e restituita nel momento in cui la funzione interna viene eseguita!

Inoltre, le variabili intrappolate da una chiusura sono accessibili solo alle funzioni interne e non all'ambiente più esterno che ha portato la chiusura in essere. Questa funzione ci consente, ad esempio, di creare strutture classiche con membri privati ​​e pubblici anche in assenza di parole chiave "pubbliche" e "private".

Le chiusure sono rese possibili dall'uso di variabili esterne da parte delle funzioni interne che sopprimono la "garbage collection" di javaScript che altrimenti distruggerebbe l'ambiente della funzione esterna in un punto indeterminato dopo il completamento.

L'importanza delle chiusure per una programmazione javaScript buona e ordinata non può essere eccessivamente sollecitata.

Nel codice qui sotto la funzione getData() forme, ad ogni chiamata, una chiusura intrappolando id1 e id2 (e url), che rimangono a disposizione del gestore di risposta ajax anonima (terzo argomento $ .get di).

$(document).ready(function() { 

    function getData(url, id1, id2) { 
     $.get(url, Common.genSafeId(), function(data) { 
      $(id1).html(data); 
      $(id2).addClass("empty"); 
     }); 
    } 

    getData('/activity', '#stream', '#load_activity'); 
    getData('/messages', '#message', '#load_messages'); 
    getData('/deals', '#new_deals_container', '#load_deal'); 
    getData('/tasks', '#task_frames', '#load_task'); 

}); 

Così, piuttosto che scrivere quattro gestori separati, sfruttiamo la capacità del linguaggio di formare chiusure e chiamare la funzione stesso, getData(), quattro volte. Ad ogni chiamata, getData() forma una nuova chiusura che consente al gestore di risposta $ .get (chiamato in modo asincrono quando il server risponde) di indirizzare gli elementi DOM negli elementi .

+3

Ho imparato molto da questa risposta, ma mi ci è voluto un po 'per capire cosa c'era di sbagliato nel codice originale nella domanda. È perché la variabile "data" è in effetti lo stesso oggetto/istanza di ogni chiamata, quindi viene riutilizzata anche dalle funzioni interne (chiusure)? Immagino di essermi quasi aspettato che il run-time di JavaScript sapesse creare qui 4 oggetti separati, dato che sono usati in questo (un po 'strano) scope, e mai prima o al di fuori di esso. Sicuramente felice di non dover affrontare quel livello di oscurità nella maggior parte delle altre lingue con cui lavoro. – eselk

+0

@eselk, guardandolo di nuovo 9 mesi dopo, non sono sicuro di come/perché il codice nella domanda potrebbe aver combinato le cose. Penso che sia stato aggiunto dopo che ho iniziato a rispondere alla domanda, e mi chiedo se sia la soluzione dell'OP stesso, non il codice che ha dato i sintomi descritti. Quel che è certo è che quattro funzioni indipendenti, una per '$ .get()', non sono necessarie. La mia funzione 'getData()' semplifica le cose. Una volta che hai le chiusure a mente tonda, sono piuttosto semplici - e sicuramente molto più semplici nella pratica di quanto una definizione formale possa farti credere. –

+0

@ Beetroot-Beetroot Devo eseguire 12 chiamate Ajax contemporaneamente sul caricamento della pagina. Sembra che una risposta venga copiata in un'altra per alcuni. Ciò è dovuto alle limitazioni del browser relative al numero di chiamate simultanee? –

Problemi correlati