JQuery – Memorizzazione della risposta ajax nella variabile globale

Sono ancora un po ‘un novizio su jQuery e sulla scena Ajax, ma ho una richiesta $ .ajax che esegue un GET per recuperare alcuni file XML (~ 6 KB o meno), tuttavia per la durata che l’utente spende su quella pagina che il contenuto XML dovrebbe non / non cambierà (questo disegno non posso cambiare, non ho nemmeno l’accesso per cambiare il file XML mentre lo sto leggendo da qualche altra parte). Quindi ho una variabile globale in cui memorizzo i dati di risposta, e qualsiasi successiva analisi dei dati viene eseguita su questa variabile, quindi non è necessario effettuare più richieste.

Dato che il file XML può aumentare, non sono sicuro che questa sia la migliore pratica, e anche da un background java le mie opinioni sulle variabili pubbliche globali sono generalmente un no-no.

Quindi la domanda che ho è se ci potrebbe essere un modo migliore per farlo, e una domanda se questo causa problemi di memoria se il file si espande in qualche ridicola dimensione del file?

Immagino che i dati possano essere passati ad alcune funzioni di tipo getter / setter all’interno dell’object xml, il che risolverebbe i miei problemi di variabili pubbliche globali, ma solleva comunque la questione se dovrei memorizzare la risposta all’interno dell’object stesso.

Ad esempio, quello che faccio attualmente è:

// top of code var xml; // get the file $.ajax({ type: "GET", url: "test.xml", dataType: "xml", success : function(data) { xml = data; } }); // at a later stage do something with the 'xml' object var foo = $(xml).find('something').attr('somethingElse'); 

Non c’è modo di aggirarlo se non per memorizzarlo. Il paging della memoria dovrebbe ridurre i potenziali problemi lì.

Suggerirei invece di usare una variabile globale chiamata ‘xml’, fare qualcosa di più simile a questo:

 var dataStore = (function(){ var xml; $.ajax({ type: "GET", url: "test.xml", dataType: "xml", success : function(data) { xml = data; } }); return {getXml : function() { if (xml) return xml; // else show some error that it isn't loaded yet; }}; })(); 

quindi accedervi con:

 $(dataStore.getXml()).find('something').attr('somethingElse'); 

Ecco una funzione che fa abbastanza bene il lavoro. Non ho potuto ottenere la migliore risposta sopra per funzionare.

 jQuery.extend({ getValues: function(url) { var result = null; $.ajax({ url: url, type: 'get', dataType: 'xml', async: false, success: function(data) { result = data; } }); return result; } }); 

Quindi per accedervi, crea la variabile in questo modo:

 var results = $.getValues("url string"); 

Questo ha funzionato per me:

 var jqxhr = $.ajax({ type: 'POST', url: "processMe.php", data: queryParams, dataType: 'html', context: document.body, global: false, async:false, success: function(data) { return data; } }).responseText; alert(jqxhr); // or... return jqxhr; 

Importante da notare: global: false , async:false e infine responseText incatenato alla richiesta $.ajax .

Non devi fare nulla di tutto ciò. Ho incontrato lo stesso problema con il mio progetto. ciò che fai è effettuare una chiamata di funzione all’interno della richiamata in caso di successo per ripristinare la variabile globale. Finché hai impostato javascript asincrono su false, funzionerà correttamente. Ecco il mio codice. Spero che sia d’aiuto.

 var exists; //function to call inside ajax callback function set_exists(x){ exists = x; } $.ajax({ url: "check_entity_name.php", type: "POST", async: false, // set to false so order of operations is correct data: {entity_name : entity}, success: function(data){ if(data == true){ set_exists(true); } else{ set_exists(false); } } }); if(exists == true){ return true; } else{ return false; } 

Spero che questo ti aiuti.

il problema potrebbe non essere correlato a qualsiasi ambito locale o globale, a parte il ritardo del server tra la funzione “successo” in esecuzione e il momento in cui si tenta di estrarre i dati dalla variabile.

è probabile che tu stia cercando di stampare il contenuto della variabile prima che la funzione “successo” di ajax venga triggersta.

Potresti trovare più semplice memorizzare i valori di risposta in un elemento DOM, poiché sono accessibili a livello globale:

   

Questo ha il vantaggio di non dover impostare async su false. Chiaramente, se questo è appropriato dipende da ciò che stai cercando di ottenere.

  function getJson(url) { return JSON.parse($.ajax({ type: 'GET', url: url, dataType: 'json', global: false, async: false, success: function (data) { return data; } }).responseText); } var myJsonObj = getJson('/api/current'); 

Funziona !!!

  function get(a){ bodyContent = $.ajax({ url: "/rpc.php", global: false, type: "POST", data: a, dataType: "html", async:false } ).responseText; return bodyContent; } 

Ho davvero faticato a ottenere i risultati di jQuery ajax nelle mie variabili nella fase “document.ready” degli eventi.

jQuery’s ajax verrebbe caricato nelle mie variabili quando un utente ha triggersto un evento “onchange” di una casella di selezione dopo che la pagina era già stata caricata, ma i dati non avrebbero alimentato le variabili quando la pagina è stata caricata per la prima volta.

Ho provato molti, molti, molti metodi diversi, ma alla fine, è stato il metodo di Charles Guilbert che ha funzionato meglio per me.

Un saluto affettuoso a Charles Guilbert! Usando la sua risposta, sono in grado di ottenere dati nelle mie variabili, anche quando la mia pagina viene caricata per la prima volta.

Ecco un esempio dello script di lavoro:

  jQuery.extend ( { getValues: function(url) { var result = null; $.ajax( { url: url, type: 'get', dataType: 'html', async: false, cache: false, success: function(data) { result = data; } } ); return result; } } ); // Option List 1, when "Cats" is selected elsewhere optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats"); // Option List 1, when "Dogs" is selected elsewhere optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs"); // Option List 2, when "Cats" is selected elsewhere optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats"); // Option List 2, when "Dogs" is selected elsewhere optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs"); 

Anche in questo. Molte risposte, tuttavia, solo una semplice e corretta che fornirò. La chiave è rendere la tua chiamata $ .ajax..sync!

 $.ajax({ async: false, ... 

IMO è ansible memorizzare questi dati nella variabile globale. Ma sarà meglio usare qualche nome univoco o usare namespace:

MyCompany = {};


MyCompany.cachedData = data;

Ed inoltre è meglio usare json per questi scopi, i dati in formato json di solito sono molto più piccoli degli stessi dati in formato xml.

Suggerirei di evitare l’estrazione di file XML di grandi dimensioni dal server: la variabile “xml” dovrebbe essere usata come una cache e non come l’archivio dati stesso.

Nella maggior parte degli scenari, è ansible esaminare la cache e vedere se è necessario effettuare una richiesta al server per ottenere i dati che si desidera. Ciò renderà la tua app più leggera e veloce.

evviva, jrh.

.get le risposte vengono memorizzate nella cache per impostazione predefinita. Quindi è davvero necessario non fare nulla per ottenere i risultati desiderati.

So che il thread è vecchio, ma ho pensato che qualcun altro potrebbe trovare questo utile. Secondo il jquey.com

 var bodyContent = $.ajax({ url: "script.php", global: false, type: "POST", data: "name=value", dataType: "html", async:false, success: function(msg){ alert(msg); } }).responseText; 

aiuterebbe a ottenere il risultato direttamente in una stringa. Nota il .responseText; parte.