Jest to częsty problem z Javascriptem. Kod JavaScript musi być napisany w stylu przekazywania kontynuacji. To jest denerwujące, ale jest czymś, co można przekonwertować bez myślenia za dużo.
basicaly, gdy chcemy mieć coś podobnego
var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
Możemy przekształcić go w kodzie asynchronicznej poprzez cały kod po funkcja zwraca do funkcji kontynuacji i obracając x ze zmiennej do parametru ciągłe oddzwanianie.
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
Należy pamiętać, że bardzo łatwo jest napisać mylący kod. Dobrą sztuczką, o której należy pamiętać, jest to, że możesz sprawić, że twoje własne funkcje będą również odbierane. To pozwala im być używany przez inną funkcję (tak jak normalne funkcje synchronizacji pomocniczych, które zwracają wartość mogą być wykorzystane przez różne funkcje)
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');
});
Sztuką jest, aby zmienić wszystkie wypowiedzi powrocie z funkcji do wywołania funkcji funkcja zwrotna. Wydaje się, że funkcja async nigdy nie została zwrócona, a jedynym sposobem, aby zwrócić wartość komuś, jest przekazanie tej wartości do wywołania zwrotnego.
Możesz zapytać, dlaczego nie ma prostszego sposobu na zrobienie tego wszystkiego. No cóż, nie ma, chyba że używasz innego języka zamiast Javascript (lub przynajmniej czegoś, co pozwala pisać kod asynchroniczny w stylu synchronicznym, ale automatycznie kompiluje się do zwykłego Javascript)
Po przeniesieniu słowa kluczowego 'var' z funkcja i przed początkowym 'xyz', możesz użyć go w dowolnym miejscu w tym zakresie w dowolnej funkcji, która wykonuje się po zakończeniu żądania ajax. – Paulpro
Chociaż * jest * ** synchroniczne ** AJAX (jest to * udokumentowane * w jQuery), zwykle należy * tego unikać * z powodu negatywnego wpływu, jaki ma na wrażenia użytkownika. Zamiast tego skoncentruj się na wykorzystaniu modelu asynchronicznego AJAX opartego na zdarzeniach. Oznacza to, że zaktualizuj DOM za pomocą 'xyz' * od wewnątrz * wywołania zwrotnego. –
@ pst. To samo pytanie przez cały czas. Ten i problem z DOM. – gdoron