2009-08-04 17 views
39

Io uso prototipo di fare il mio sviluppo AJAX, e io uso il codice come questo:Come restituire il testo di risposta 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; 
} 

e trovo che il "risultato" è una stringa vuota. Quindi, ho provato questo:

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; 
      } 
     } 
    }); 

} 

Ma non ha funzionato anche. Come posso ottenere il responseText per altri metodi da usare?

risposta

27

Ricordare che onComplete viene chiamato molto tempo dopo il funzionamento di someFunction. Quello che devi fare è passare una funzione di callback alla funzione some come parametro. Questa funzione verrà chiamato quando il processo è fatto di lavoro (cioè, 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

La tua risposta è fantastica, più funzionale/oop style, e davvero, davvero eccezionale. Tuttavia, la risposta di [qualcuno] era al punto: asincrono: il falso è più facile e più facile ciò che l'autore della domanda desiderava (ma la soluzione è più estensibile e flessibile). –

+1

asincrono: false interromperà il browser fino a quando la risposta non sarà stata ricevuta. Se la connessione di rete è lenta, ci vogliono alcuni secondi per connettersi al server, quindi l'intero browser potrebbe bloccarsi per alcuni secondi e non risponderà all'input dell'utente. Questa non è una buona usabilità. Potrebbe essere più semplice, ma non si comporta bene, e quindi ** 'asincrono: falso' non dovrebbe mai essere usato **. – Marius

+0

scusate, non avevo effettivamente usato in precedenza asincrono. Hai ragione, quindi è praticamente la stessa di 'function ajaxLoader() {var fAjaxLoaded = false; $. Ajax (..., success: function() {fAjaxLoaded = true;}); while (fAjaxLoaded); return ...} ' –

3

ne dite di aggiungere "asincrona: false" nel codice? Nel mio caso, ha funzionato bene :)

+0

che sconfigge lo scopo di ajax giusto? –

+5

Questo è male perché, con le richieste sincrone, stai bloccando l'esecuzione di JS nel browser fino a quando la richiesta non ritorna. – finishingmove

+1

Sconfigge lo scopo ma salva la giornata. –

Problemi correlati