Questo è un problema comune con Javascript. Il codice Javascript deve essere scritto in stile passaggio continuo. È fastidioso ma è qualcosa che puoi convertire senza pensare troppo.
Basicaly, ogni volta che avremmo qualcosa come
var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
possiamo convertirlo in codice asincrono per rendere tutto il codice dopo la funzione restituisce in una funzione continuazione e girando x da una variabile in un parametro del callback di continuazione.
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
Devi fare attenzione che è molto facile scrivere codice confuso. Un buon trucco da tenere a mente è che puoi far sì che le tue funzioni ricevano anche i callback. Questo permette loro di essere utilizzati da diverse funzioni (proprio come le normali funzioni di sincronizzazione di supporto che restituisce un valore può essere utilizzato da diverse funzioni)
var getXyz = function(onResult){ //async functions that return do so via callbacks
//you can also another callback for errors (kind of analogous to throw)
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
onResult(xyz); //instead of writing "return xyz", we pass x to the callback explicitely.
});
};
getXyz(function(xyz){ //this would look like "var xyz = getXyz();" if it were sync code instead.
console.log('got xyz');
});
Il trucco è quello di cambiare tutte le dichiarazioni di ritorno dalla funzione in chiamate al funzione di callback. Pensa come se la funzione asincrona non fosse mai ritornata e l'unico modo per restituire un valore a qualcuno è di passare quel valore a un callback.
Si potrebbe chiedere perché non c'è un modo più semplice per fare tutto questo. Beh, non c'è, a meno che non usi un'altra lingua invece di Javascript (o almeno qualcosa che ti permetta di scrivere codice asincrono in stile sincrono ma compili automaticamente in Javascript)
Se muovi la parola chiave 'var' dal tuo funzione e davanti al tuo 'xyz' iniziale, quindi puoi usarlo ovunque in quell'ambito in qualsiasi funzione che viene eseguita dopo il completamento della richiesta ajax. – Paulpro
Anche se * è * ** sincrono ** AJAX (è * documentato * in jQuery), di solito dovrebbe * essere evitato * a causa dell'impatto negativo che ha sull'esperienza utente. Concentrati invece sull'utilizzo del modello basato su eventi di AJAX asincrono. Ovvero, aggiorna il DOM con 'xyz' * da * il callback. –
@pst. La stessa domanda tutto il tempo. Questo e il problema del DOM pronto. – gdoron