2009-10-28 11 views
33

Próbuję wywołać funkcję zawierającą kod jQuery. Chcę, aby ta funkcja zwróciła wyniki instrukcji jQuery. To nie działa, a ja próbuję zrozumieć dlaczego.

function showGetResult (name) { 
    var scriptURL = "somefile.php?name=" + name; 
    return $.get(scriptURL, {}, function(data) { return data; }); 
} 

alert (showGetResult("John")); 

Alert wyświetla "[object XMLHttpRequest]." Jeśli jednak samodzielnie uruchomię instrukcję jQuery, poza funkcją, działa ona poprawnie ->$.get(scriptURL, {}, function(data) { alert(data); })

Chciałbym móc ponownie użyć tego kodu, umieszczając go wewnątrz funkcji, która zwraca $.get dane. Jaki podstawowy błąd popełniam tutaj?

Odpowiedz

87

Masz kilka różnych błędów. Po pierwsze, $ .get nie zwraca zwróconej wartości funkcji wywołania zwrotnego. Zwraca obiekt XHR. Po drugie, funkcja get nie jest zsynchronizowana, jest asynchroniczna, więc showGetResult prawdopodobnie zwróci przed zakończeniem. Po trzecie, nie możesz zwrócić czegoś z wewnątrz wywołania zwrotnego do zewnętrznego zakresu. Można jednak powiązać zmienną w zewnętrznym zasięgu i ustawić ją w wywołaniu zwrotnym.

Aby uzyskać pożądaną funkcjonalność, należy użyć wartości $ .ajax i ustawić opcję asynchroniczną na wartość false. Następnie możesz zdefiniować zmienną w zewnętrznym zasięgu i przypisać ją w wywołaniu ajax, zwracając tę ​​zmienną z funkcji.

function showGetResult(name) 
{ 
    var result = null; 
    var scriptUrl = "somefile.php?name=" + name; 
    $.ajax({ 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'html', 
     async: false, 
     success: function(data) { 
      result = data; 
     } 
    }); 
    return result; 
} 

można byłoby prawdopodobnie lepiej służył jednak dowiedzieć się, jak to zrobić, co chcesz w samej funkcji wywołania zwrotnego zamiast zmieniać z asynchronicznym do połączeń synchronicznych.

+1

Dzięki za dokładny podział. Kombinacja przełączania na synchroniczne i używania zmiennej w zewnętrznym zakresie do przekazywania danych rozwiązała mój problem. – Kai

+5

Jest to w porządku, ale należy pamiętać, że przełączenie na synchroniczne powoduje, że przeglądarka blokuje się podczas oczekiwania na odpowiedź. To prawdopodobnie pomyłka, chyba że wiesz, że twój użytkownik zawsze będzie na błyskawicznym połączeniu, a twój serwer nigdy nie zostanie zalany.Jest to również sprzeczne z tym, o co chodzi w AJAX - ma to na celu sprawienie, by aplikacje internetowe były bardziej responsywne, ale ta zmiana może potencjalnie sprawić, że twoja odpowiedź stanie się mniej responsywna. –

+0

Zgadzam się z @JacobM, że lepiej jest użyć asynchronicznego, jeśli w ogóle możliwe i poradzić sobie z działaniami w wywołaniu zwrotnym. – tvanfosson

1

Jest to niewłaściwy sposób. Funkcja (dane) to funkcja oddzwaniania, więc gdy tylko zostanie wykonana , funkcja $ .get wykona ... istnieje możliwość, że funkcja oddzwaniania nie zostałaby wywołana.

Lepiej wywołać funkcję pobierania danych postu z metody function (data).

9

Podstawowym błędem, który popełniasz, jest to, że wywołanie AJAX jest wykonywane asynchronicznie, więc do czasu, kiedy wrócisz, wynik nie jest jeszcze gotowy. Aby to zadziałało, możesz zmodyfikować swój kod:

$(function() { 
    showGetResult('John'); 
}); 

function showGetResult (name) { 
    $.get('somefile.php', { 
     // Pass the name parameter in the data hash so that it gets properly 
     // url encoded instead of concatenating it to the url. 
     name: name 
    }, function(data) { 
     alert(data); 
    }); 
} 
+0

zadaniem jest zwrócić ten wynik „dane”, aby nie drukować podczas ładowane z serwera. – Vlado

2

Podstawowym błędem jest "asynchroniczna" część AJAX. Ponieważ nie wiesz, ile czasu zajmie serwer, aby wysłać odpowiedź, metody AJAX nigdy nie "blokują" - to znaczy, nie wywołujesz serwera i po prostu siedzisz czekając na wynik. Zamiast tego przechodzisz do czegoś innego, ale konfigurujesz metodę zwaną "oddzwanianiem", która uruchomi się po powrocie wyników. Ta metoda jest odpowiedzialna za zrobienie tego, co należy zrobić z danymi (np. Wstrzyknięcie go na stronę).

Powiązane problemy