Como faço para uma função esperar até que todas as solicitações jQuery Ajax sejam feitas dentro de outra função?
Em resumo, preciso aguardar que todas as solicitações do Ajax sejam feitas antes de executar a próxima. Mas como?
javascript
jquery
ajax
jamietelin
fonte
fonte
Respostas:
O jQuery agora define uma função when para esse propósito.
Ele aceita qualquer número de objetos adiados como argumentos e executa uma função quando todos eles forem resolvidos.
Isso significa que, se você deseja iniciar (por exemplo) quatro solicitações ajax, execute uma ação quando elas forem concluídas, você pode fazer algo assim:
Na minha opinião, cria uma sintaxe limpa e clara e evita o envolvimento de variáveis globais como ajaxStart e ajaxStop, que podem ter efeitos colaterais indesejados à medida que a página se desenvolve.
Se você não sabe de antemão quantos argumentos ajax precisa esperar (ou seja, deseja usar um número variável de argumentos), isso ainda pode ser feito, mas é um pouco mais complicado. Consulte Passar em uma matriz de adiados para $ .when () (e talvez jQuery .when ao solucionar problemas com número variável de argumentos ).
Se você precisar de um controle mais profundo sobre os modos de falha dos scripts ajax, etc., poderá salvar o objeto retornado
.when()
- é um objeto jQuery Promise que abrange todas as consultas ajax originais. Você pode ligar.then()
ou.fail()
nele para adicionar manipuladores detalhados sucesso / fracasso.fonte
$.when
retorna umPromise
objeto que possui métodos mais úteis, não apenas.done
. Por exemplo, com o.then(onSuccess, onFailure)
método, você pode reagir quando as duas solicitações forem bem-sucedidas ou pelo menos uma delas falhar.fail
caso. Ao contráriodone
, osfail
disparos imediatamente na primeira falha e desconsideram os demais adiados.onFailure
função pode ser anexada. Como indiquei em um comentário à pergunta do OP: ele pode querer indicar com mais precisão o que ele quis dizer com "pronto". "Ryan Mohr" também tinha um ponto muito bom sobre o fato de quefail
se comporta de forma diferente comodone
, alguns mais leitura a ser feito sobrePromises
Acho html5rocks.com/en/tutorials/es6/promisesSe você quiser saber quando todas as
ajax
solicitações foram concluídas no seu documento, não importa quantas delas existam, basta usar o evento $ .ajaxStop desta maneira:Atualização:
se você deseja manter a
ES
sintaxe, pode usar Promise.all paraajax
métodos conhecidos :Um ponto interessante aqui é que ele trabalha com
Promises
e$.ajax
solicita.Aqui está a demonstração do jsFiddle .
Atualização 2:
versão ainda mais recente usando a sintaxe assíncrona / aguardada :
fonte
Eu encontrei uma boa resposta por gnarf my self, que é exatamente o que eu estava procurando :)
jQuery ajaxQueue
Em seguida, você pode adicionar uma solicitação ajax à fila como esta:
fonte
Use o
ajaxStop
evento.Por exemplo, digamos que você tenha uma mensagem carregando ... enquanto busca 100 solicitações ajax e deseja ocultar essa mensagem depois de carregada.
No documento jQuery :
Observe que ele aguardará todas as solicitações de ajax serem feitas nessa página.
fonte
NOTA: As respostas acima usam funcionalidades que não existiam no momento em que essa resposta foi escrita. Eu recomendo usar
jQuery.when()
essas abordagens, mas estou deixando a resposta para fins históricos.-
Você provavelmente poderia se dar bem com um semáforo de contagem simples, embora a maneira como você o implemente dependa do seu código. Um exemplo simples seria algo como ...
Se você quiser que isso funcione como {async: false}, mas não queira bloquear o navegador, poderá realizar o mesmo com uma fila jQuery.
fonte
.get()
. Dessa forma, pelo menos você não duplica esse código. Não apenas isso, mas declararfunction(){}
cada vez aloca memória cada vez! Em vez disso, é uma prática ruim se você puder chamar uma função definida estaticamente.O javascript é baseado em eventos; portanto, você nunca deve esperar ; em vez disso, defina ganchos / retornos de chamada
Provavelmente, você pode apenas usar os métodos de sucesso / completo do jquery.ajax
Ou você pode usar .ajaxComplete :
embora você deva postar um pseudocódigo de como suas solicitações ajax são chamadas para serem mais precisas ...
fonte
Uma pequena solução alternativa é algo como isto:
A esperança pode ser útil ...
fonte
O jQuery permite especificar se você deseja que a solicitação ajax seja assíncrona ou não. Você pode simplesmente tornar as solicitações ajax síncronas e o restante do código não será executado até que retornem.
Por exemplo:
fonte
Se você precisar de algo simples; retorno de chamada único e concluído
fonte
Além disso, você pode usar o async.js .
Eu acho que é melhor do que $. Quando, porque você pode mesclar todos os tipos de chamadas assíncronas que não suportam promessas prontas, como tempos limite, chamadas do SqlLite etc. e não apenas solicitações de ajax.
fonte
Com base na resposta do @BBonifield, escrevi uma função de utilitário para que a lógica do semáforo não seja espalhada em todas as chamadas ajax.
untilAjax
é a função de utilitário que chama uma função de retorno de chamada quando todos os ajaxCalls são concluídos.ajaxObjs
é uma matriz de objetos de configuração do ajax[http://api.jquery.com/jQuery.ajax/]
.fn
é função de retorno de chamadaExemplo:
doSomething
função usauntilAjax
.fonte
Eu recomendo usar $ .when () se você estiver começando do zero.
Embora essa pergunta tenha mais de um milhão de respostas, ainda não encontrei nada útil para o meu caso. Digamos que você precise lidar com uma base de código existente, já fazendo algumas chamadas ajax e não queira introduzir a complexidade das promessas e / ou refazer tudo.
Podemos facilmente tirar proveito do jQuery
.data
,.on
e.trigger
funções que têm sido uma parte do jQuery desde sempre.Codepen
O lado bom da minha solução é:
é óbvio do que o retorno de chamada depende exatamente
a função
triggerNowOrOnLoaded
não se importa se os dados já foram carregados ou ainda estamos esperando por elesé super fácil conectá-lo a um código existente
fonte
Estou usando a verificação de tamanho quando toda a carga do ajax foi concluída
fonte
Para expandir a resposta de Alex, tenho um exemplo com argumentos e promessas variáveis. Eu queria carregar imagens via ajax e exibi-las na página depois que todas foram carregadas.
Para fazer isso, usei o seguinte:
Atualizado para funcionar com URLs únicos ou múltiplos: https://jsfiddle.net/euypj5w9/
fonte
Como outras respostas mencionadas, você pode
ajaxStop()
aguardar até que todas as solicitações de ajax sejam concluídas.Se você deseja fazer isso para uma
ajax()
solicitação específica, o melhor que pode fazer é usar ocomplete()
método dentro de uma determinada solicitação ajax:Mas, se você precisar esperar apenas algumas e certas solicitações de ajax serem feitas? Use o maravilhoso javascript promete esperar até que o ajax que você deseja esperar esteja pronto. Fiz um exemplo breve, fácil e legível para mostrar como as promessas funcionam com o ajax.
Por favor, dê uma olhada no próximo exemplo . Eu costumava
setTimeout
esclarecer o exemplo.fonte
Eu achei uma maneira simples, usando
shift()
fonte
Minha solução é a seguinte
Funcionou muito bem. Eu tentei várias maneiras diferentes de fazer isso, mas achei a mais simples e a mais reutilizável. Espero que ajude
fonte
Veja a minha solução:
1.Insira esta função (e variável) no seu arquivo javascript:
2.Configure uma matriz com seus pedidos, desta forma:
Função 3.Create callback:
4. Ligue para a função runFunctionQueue com os parâmetros:
fonte
$.when
não funciona para mim, emcallback(x)
vez dereturn x
funcionar como descrito aqui: https://stackoverflow.com/a/13455253/10357604fonte
Tente assim. faça um loop dentro da função de script java para esperar até que a chamada ajax termine.
fonte
setTimeout()
NÃOtake a sleep
. Nesse caso, você apenas bloqueia todas as guias até quedone
se torne realidade.done
nunca seja verdade enquanto o loop while ainda estiver em execução. Se o loop while estiver em execução, o loop de eventos não poderá continuar e, portanto, nunca executará o retorno de chamada para o sucesso do ajax.