jQuery: realización de solicitudes síncronas AJAX

187

He hecho algo de jQuery en el pasado, pero estoy completamente atascado en esto. Conozco los pros y los contras del uso de llamadas síncronas ajax, pero aquí será necesario.

La página remota se carga (controlada con firebug), pero no se muestra ningún retorno.

¿Qué debo hacer diferente para que mi función regrese correctamente?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}
Industrial
fuente
Tu código se ve bien. ¿Qué está regresando? ¿Hay algún error js?
ShankarSangoli
11
Me parece bastante irónico: está preguntando cómo realizar la operación "Asynchronous JavaScript & XML" de forma sincronizada. Lo que realmente necesita realizar es un "SJAX".
VitalyB
3
Nota: la especificación ha comenzado a rechazar las solicitudes de AJAX sincrónicas.
Léo Lam
2
parece que la afirmación "[síncrono] será necesario" indica una falta de comprensión de los motores de JavaScript, por lo tanto, una aplicación mal diseñada. Me gustaría entender si hay casos en los que realmente se requiere sincronización.
pmont 01 de
15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.O una muy buena comprensión: si desea hacer una llamada AJAX onbeforeunload, el uso de una solicitud sincrónica es realmente la forma recomendada (ya que la ventana del navegador desaparecería antes de que la solicitud regresara). De alguna manera, él dice claramente: 'Sé acerca de los pros y los contras de usar llamadas síncronas ajax' ... ¿Tal vez solo le creas?
Stijn de Witt

Respuestas:

298

Como está haciendo una solicitud sincrónica, eso debería ser

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

Ejemplo: http://api.jquery.com/jQuery.ajax/#example-3

TENGA EN CUENTA: establecer la propiedad asíncrona en falso está en desuso y en proceso de eliminación ( enlace ). Muchos navegadores, incluidos Firefox y Chrome, ya han comenzado a imprimir una advertencia en la consola si usa esto:

Cromo:

XMLHttpRequest síncrono en el subproceso principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final. Para obtener más ayuda, consulte https://xhr.spec.whatwg.org/ .

Firefox

XMLHttpRequest síncrono en el subproceso principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final. Para más ayuda http://xhr.spec.whatwg.org/

Dogbert
fuente
16
Tenga en cuenta que responseTextsiempre devuelve una cadena. Si está esperando JSON, termine $.ajaxcon JSON.parse.
usandfriends
66
Nota: xhr.spec.whatwg.org/#the-open()-method Las solicitudes sincrónicas están en desuso ...
teynon
55
@Tom Y también las etiquetas <i>y <b>. Mi recomendación: sigue usando estas funciones para que no desaparezcan.
Stijn de Witt
1
ya que esto bloquea el navegador, tiene sentido agregar un tiempo de espera: aproximadamente 5000 a las opciones.
commonpike
1
@usandfriends Para que la cadena de análisis se oponga es más seguro usar jQuery.parseJSON en lugar de JSON.parse stackoverflow.com/questions/10362277/…
AntonE
33

Estás utilizando la función ajax de forma incorrecta. Como es síncrono, devolverá los datos en línea de la siguiente manera:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;
Jake
fuente
17

¿Qué tan remota es esa url? ¿Es del mismo dominio? el código se ve bien

prueba esto

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;
El cerebro
fuente
¡Sí! El mismo dominio y todo. remote_urlse define correctamente y la llamada AJAX se realiza correctamente como se menciona (controlado con firebug). Simplemente no hay vuelta!
Industrial
3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}
usuario3116547
fuente
77
Incluya alguna explicación de por qué esto ayudará al OP.
krillgar
Es una buena práctica devolver un objeto json desde el lado del servidor. Te da más control. Pero, debe agregar dataType: "json" a sus parámetros $ .ajax anteriores.
jjwdesign
¿Qué significa esto: "Te da más control"?
grantwparks
3
No relacionado, pero puede: return result.valid; // Esto ya es un booleano
dpineda