jQuery: Executando solicitações AJAX síncronas

187

Eu fiz jQuery no passado, mas estou completamente preso a isso. Conheço os prós e os contras do uso de chamadas síncronas ajax, mas aqui será necessário.

A página remota é carregada (controlada com o firebug), mas nenhum retorno é mostrado.

O que devo fazer diferente para que minha função retorne corretamente?

function getRemote() {

    var remote;

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

    return remote;

}
Industrial
fonte
Seu código parece bem. o que está retornando? Existem erros de js?
precisa
11
Acho irônico - Você está perguntando como executar a operação "JavaScript assíncrono e XML", de forma síncrona. O que você realmente precisa executar é um "SJAX".
precisa saber é o seguinte
3
Nota: a especificação começou a descontinuar solicitações síncronas de AJAX.
Léo Lam
2
parece que a declaração "[síncrona] será necessária" indica uma falta de entendimento dos mecanismos JavaScript, portanto, um aplicativo mal arquitetado. Gostaria de entender se há casos em que a sincronização é realmente necessária.
Pmf
15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.Ou um entendimento muito bom: se você deseja fazer uma chamada AJAX onbeforeunload, usar uma solicitação síncrona é realmente a maneira recomendada (já que a janela do navegador desapareceria antes que a solicitação retornasse). De qualquer forma, ele diz claramente: "Eu sei sobre os prós e os contras do uso de chamadas síncronas ajax" ... Talvez apenas acredite nele?
Stijn de Witt

Respostas:

297

Como você está fazendo uma solicitação síncrona, isso deve ser

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

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

OBSERVAÇÃO: A configuração da propriedade assíncrona como false está obsoleta e está sendo removida ( link ). Muitos navegadores, incluindo Firefox e Chrome, já começaram a imprimir um aviso no console se você usar este:

Cromada:

O XMLHttpRequest síncrono no encadeamento principal foi descontinuado por causa de seus efeitos prejudiciais à experiência do usuário final. Para obter mais ajuda, consulte https://xhr.spec.whatwg.org/ .

Raposa de fogo:

O XMLHttpRequest síncrono no encadeamento principal foi descontinuado por causa de seus efeitos prejudiciais à experiência do usuário final. Para obter mais ajuda http://xhr.spec.whatwg.org/

Dogbert
fonte
16
Observe que responseTextsempre retorna uma string. Se você está esperando JSON, encerre $.ajaxcom JSON.parse.
usandfriends
6
Nota: xhr.spec.whatwg.org/#the-open()-method pedidos synchrounous estão obsoletos ...
teynon
5
@ Tom E o mesmo aconteceu com as tags <i>e <b>. Minha recomendação: continue usando esses recursos para que eles não desapareçam.
Stijn de Witt
1
como isso bloqueia o navegador, faz sentido adicionar um tempo limite: aproximadamente 5000 às opções.
commonpike
1
@usandfriends Para analisar a string do objeto, é mais seguro usar o jQuery.parseJSON em vez do JSON.parse stackoverflow.com/questions/10362277/…
AntonE
33

Você está usando a função ajax incorretamente. Como é síncrono, os dados serão retornados da seguinte maneira:

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

quão remoto é esse URL? é do mesmo domínio? o código parece bem

tente isso

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;
O cérebro
fonte
Sim! Mesmo domínio e tudo. remote_urlé definido corretamente e a chamada AJAX é realizada corretamente conforme mencionado (controlado com o firebug). Apenas sem retorno!
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;
        }
    });
}
user3116547
fonte
7
Por favor, inclua algumas explicações sobre por que isso ajudará o OP.
krillgar
É uma boa prática retornar um objeto json do lado do servidor. Dá a você mais controle. Mas você precisa adicionar dataType: "json" aos seus parâmetros $ .ajax acima.
Jjwdesign # 22/15
O que isso significa: "Dá mais controle"?
Concede 01/07
3
Não relacionado, mas você pode: retornar result.valid; // Isso já é um booleano
dpineda