2009-10-28 12 views
33

Estoy tratando de llamar a una función que contiene el código jQuery. Quiero que esta función devuelva los resultados de la declaración jQuery. No está funcionando, y estoy tratando de descubrir por qué.

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

alert (showGetResult("John")); 

Las pantallas de alerta "[object XMLHttpRequest]." Sin embargo, si ejecuto la instrucción jQuery por sí mismo, fuera de una función, funciona bien ->$.get(scriptURL, {}, function(data) { alert(data); })

Me gustaría poder volver a utilizar este código al ponerlo dentro de una función que devuelve el $.get datos. ¿Qué error fundamental estoy haciendo aquí?

Respuesta

87

Tiene algunos errores diferentes. Primero, $ .get no devuelve el valor de retorno de la función de devolución de llamada. Devuelve el objeto XHR. En segundo lugar, la función get no es síncrona, es asincrónica, por lo que showGetResult probablemente regrese antes de que se complete. En tercer lugar, no puede devolver algo desde dentro de la devolución de llamada al ámbito externo. Sin embargo, puede vincular una variable en el ámbito externo y configurarla en la devolución de llamada.

Para obtener la funcionalidad que desee, deberá usar $ .ajax y establecer la opción asincrónica en falso. Luego puede definir una variable en el ámbito externo y asignarla en la devolución de llamada ajax, devolviendo esta variable desde la función.

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

Probablemente sería mejor servido, sin embargo, encontrar la manera de hacer lo que quiere en la función de devolución de llamada en sí en lugar de cambiar de asíncrono a las llamadas síncronas.

+1

Gracias por el desglose completo. La combinación de cambiar a sincrónico y usar una variable en el alcance externo para pasar datos, ha resuelto mi problema. – Kai

+5

Eso está bien, pero tenga en cuenta que al cambiar a sincrónico, puede causar que el navegador se bloquee mientras espera la respuesta. Probablemente sea un error, a menos que sepa que su usuario siempre estará en una conexión rápida y su servidor nunca se inundará.También es contrario a lo que AJAX se trata: está destinado a hacer que las aplicaciones web sean más receptivas, pero este cambio podría hacer que el suyo sea mucho menos receptivo. –

+0

Estoy de acuerdo con @JacobM en que es mejor usar asincrónico si es posible y ocuparme de tus acciones en la devolución de llamada. – tvanfosson

1

Esta es la forma incorrecta de hacerlo. La función (datos) es una función de devolución de llamada por lo que siempre que se ejecute return $ .get ... existe la posibilidad de que no se haya llamado a la función de devolución de llamada.

Mejor llame a su función de obtención de datos de publicación desde el método de función (datos).

9

El error fundamental que está cometiendo es que la llamada AJAX se realiza de forma asíncrona, por lo que en el momento en que regrese, el resultado aún no está listo. Para que esto funcione, puede modificar su código de esta manera:

$(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

tarea es devolver este resultado 'datos', no imprimir cuando cargado desde el servidor. – Vlado

2

El error fundamental es la parte "asincrónica" de AJAX. Como no sabe cuánto tiempo demorará el servidor en enviar una respuesta, los métodos AJAX nunca se "bloquean", es decir, no llama al servidor y se queda allí sentado esperando el resultado. En cambio, vas a otra cosa, pero configuras un método, llamado "devolución de llamada", que se activará cuando vuelvan los resultados. Este método es responsable de hacer lo que sea necesario hacer con los datos (por ejemplo, inyectándolos en la página).