2009-08-04 14 views
39

utilizo prototipo de hacer mi desarrollo AJAX, y utilizo el código de la siguiente manera:Cómo devolver el texto de respuesta 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; 
} 

y me parece que el "resultado" es una cadena vacía. Entonces, probé esto:

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

} 

Pero no funcionó también. ¿Cómo puedo obtener el texto de respuesta para otro método?

Respuesta

27

recuerde que onComplete se invoca mucho después de que someFunction termine de funcionar. Lo que debe hacer es pasar una función de devolución de llamada a la función some como parámetro. Esta función se llama cuando se realiza el proceso de trabajo (es decir, 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

Su respuesta es genial, más funcional/estilo oop, y realmente, realmente genial. Sin embargo, la respuesta de [alguien] fue al punto: asincrónico: falso es más fácil y hace más fácil lo que el autor de la pregunta quería (pero su solución es más extensible y flexible). –

+1

asincrónico: falso detendrá el navegador hasta que se reciba la respuesta. Si la conexión a la red es lenta, tarda unos segundos en conectarse al servidor, luego todo el navegador puede congelarse durante unos segundos y no responderá a la entrada del usuario. Esto no es una buena usabilidad. Puede ser más fácil, pero no se comporta bien, y por lo tanto ** 'asynchronous: false' nunca debe usarse **. – Marius

+0

lo siento, no había usado asincrónicamente antes. Tienes razón, así que eso es básicamente lo mismo que 'function ajaxLoader() {var fAjaxLoaded = false; $. Ajax (..., success: function() {fAjaxLoaded = true;}); while (fAjaxLoaded); return ...} ' –

3

Cómo sobre la adición "asíncrono: true" en el código? En mi caso, funcionó bien :)

+0

que derrota el propósito de ajax ¿verdad? –

+5

Eso es malo porque, con solicitudes sincrónicas, está bloqueando toda la ejecución de JS en el navegador hasta que la solicitud regrese. – finishingmove

+1

Derrota el propósito pero le salva el día. –

Cuestiones relacionadas