2009-08-04 17 views
39

używam prototyp zrobić mój rozwój AJAX i użyć kodu takiego:Jak zwrócić tekst odpowiedzi AJAX?

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
      } 
     } 
    }); 
    return result; 
} 

I uważam, że „wynik” jest pustym ciągiem. Tak więc próbowałem:

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       return result; 
      } 
     } 
    }); 

} 

Ale to też nie działa. Jak mogę uzyskać responseText dla innej metody do użycia?

Odpowiedz

27

Należy pamiętać, że funkcja onComplete jest wywoływana długo po zakończeniu działania funkcji someFunction. Musisz przekazać funkcję wywołania zwrotnego do jakiejś funkcji jako parametru. Ta funkcja zostanie wywołana, gdy proces odbywa pracy (tj onComplete):

somefunction: function(callback){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       callback(result); 
      } 
     } 
    }); 

} 
somefunction(function(result){ 
    alert(result); 
}); 
+0

Twoja odpowiedź jest wspaniała, bardziej funkcjonalna/oopowa i naprawdę, naprawdę świetna. Jednak odpowiedź [ktoś] -s była do rzeczy: asynchroniczna: fałsz jest łatwiejszy i ułatwia pytanie autora (ale twoje rozwiązanie jest bardziej rozszerzalne i elastyczne). –

+1

asynchroniczne: false spowoduje zatrzymanie przeglądarki, dopóki odpowiedź nie zostanie odebrana. Jeśli połączenie sieciowe jest wolne, więc połączenie się z serwerem trwa kilka sekund, cała przeglądarka może zatrzymać się na kilka sekund i nie odpowie na dane wprowadzone przez użytkownika. To nie jest dobra użyteczność. To może być łatwiejsze, ale nie zachowuje się dobrze, dlatego ** nigdy nie powinno być używane ** asynchroniczne: fałsz **. – Marius

+0

Przepraszam, wcześniej nie używałem asynchronicznego. Masz rację, więc to w zasadzie to samo, co 'function ajaxLoader() {var fAjaxLoaded = false; $. Ajax (..., success: function() {fAjaxLoaded = true;}); while (fAjaxLoaded); return ...} ' –

3

Jak o dodanie „asynchroniczny: false” w kodzie? W moim przypadku zadziałało dobrze :)

+0

, który pokonuje cel ajaxowy? –

+5

To źle, ponieważ przy żądaniach synchronicznych blokujesz wykonywanie wszystkich operacji JS w przeglądarce aż do momentu, gdy żądanie zostanie zwrócone. – finishingmove

+1

Pokonuje cel, ale oszczędza Twój dzień. –

Powiązane problemy