2009-09-22 10 views
6

Mam następujący JavaScript (jQuery) i kod:Jak mogę zwrócić wartość pobraną przez AJAX do macierzystej funkcji bieżącej funkcji w JavaScript?

function checkEmail(email) { 
    if (email.length) { 
     $.getJSON('ajax/validate', {email: email}, function(data){ 
      if (data == false) { 
       // stuff 
      } 
      return data; 
     }) 
    } 
} 

chcę anonimową funkcję do return data do funkcji dominującej checkEmail(). Próbowałem robić coś takiego:

function checkEmail(email) { 
    if (email.length) { 
     var ret = null; 
     $.getJSON('ajax/validate', {email: email}, function(data){ 
      if (data == false) { 
       // stuff 
      } 
      ret = data; 
     }) 
     return ret; 
    } 
} 

Ale oczywiście to nie będzie działać, ponieważ wywołanie $.getJSON() jest asynchroniczne, więc to będzie return ret przed żądanie GET jest zakończona.

Jakieś myśli tutaj?

Dziękujemy!

+0

Widzę ten sam problem opublikowany tutaj wiele razy dziennie. Nie zaczynaj pisać AJAX, dopóki nie zrozumiesz, jak to działa, ludzie !! –

+0

A potem ludzie głosują na to zadanie, zamiast zamykać je jako duplikaty, tak jak powinny. –

+0

FWIW, to jest zamykane jako duplikat http://stackoverflow.com/questions/1094716/how-does-one-return-data-to-original-aller-function-in-javascript, które prosi to samo. – Shog9

Odpowiedz

9

Ogólnie rzecz biorąc najlepszym sposobem na poradzenie sobie z tego typu problemem jest użycie funkcji zwrotnej. W rzeczywistości jest to jedyne możliwe rozwiązanie - jedyną opcją jest kodowanie własnych rozszerzeń do przeglądarki, a to niewiele (chyba że naprawdę lubisz walić głową o ścianę). Na tych tablicach pojawiło się kilka równoległych pytań: możesz spróbować wyszukać niektóre, wiele z nich jest bardzo dobrych.

Modyfikacja kodu:

function checkEmail(email) { 
    /* 
     original parts of the function here! 
    */ 

    if (email.length) { 
     $.getJSON('ajax/validate', {email: email}, function(data){ 
      if (data == false) { 
       // stuff 
      } 
      checkEmailResponse(data); 
     }) 
    } 
} 

function checkEmailResponse(data) 
{ 
    // do something with the data. 
} 
0

Mogłeś bloku funkcyjnego rodzic dopóki istnieje coś. Aby zmniejszyć intensywność procesora, możesz użyć limitu czasu.

function checkEmail(email) { 
if (email.length) { 
    var ret = null; 
    $.getJSON('ajax/validate', {email: email}, function(data){ 
     if (data == false) { 
      // stuff 
     } 
     ret = data; 
    }) 
    while(ret == null){ 

    } 
    return ret; 
} 

}

Nadzieja to pomaga.

0

Będziesz musiał zmienić sposób podejścia do problemu. Wiesz, że to, co masz powyżej, nie zadziała, więc nie możesz myśleć w kategoriach "zadzwoń do funkcji i działaj na jej wartości zwrotnej".

Będziesz musiał przełączyć się na sugestię CPS, np. Toby, lub w zależności od tego, co uruchamia tę funkcję, obsługę jej za pomocą niestandardowych zdarzeń.

2

Powinieneś również używać wywołania zwrotnego, ponieważ wywołanie jest asynchroniczne i dlatego projektujesz całe środowisko JavaScript wokół tego pomysłu (jak wskazali inni).

Jeśli naprawdę potrzebujesz go uzyskać jako wartość zwrotną, wyłącz wywołanie asynchroniczne, ale nie jest to zalecane, ponieważ blokuje stronę, dopóki nie pojawi się odpowiedź.

function checkEmail(email, callback) { 
    if (email.length) 
    return $.ajax({ 
     data: {email: email}, 
     url: 'ajax/validate', 
     async: false 
    }).responseText; // only the raw response text of the XMLHttpRequest 
    } 
} 
Powiązane problemy