Tenho um código parecido com este em javascript:
forloop {
//async call, returns an array to its callback
}
Depois que TODAS essas chamadas assíncronas forem feitas, quero calcular o mínimo de todas as matrizes.
Como posso esperar por todos eles?
Minha única ideia agora é ter um array de booleanos chamado done e definir done [i] como true na i-ésima função de retorno de chamada e dizer while (nem todos estão concluídos) {}
editar: Suponho que uma solução possível, mas feia, seria editar o array done em cada retorno de chamada e, em seguida, chamar um método se todos os outros feitos forem definidos em cada retorno de chamada, portanto, o último retorno de chamada a ser concluído chamará o método contínuo.
Desde já, obrigado.
javascript
asynchronous
codificadores são pessoas
fonte
fonte
while (not all are done) { }
não funcionaria. Enquanto você está ocupado esperando, nenhum de seus retornos de chamada pode ser executado.Respostas:
Você não foi muito específico com seu código, então vou inventar um cenário. Digamos que você tenha 10 chamadas ajax e deseja acumular os resultados dessas 10 chamadas ajax e, quando todas elas forem concluídas, você deseja fazer algo. Você pode fazer isso assim, acumulando os dados em uma matriz e acompanhando quando o último foi concluído:
Contador Manual
Nota: o tratamento de erros é importante aqui (não mostrado porque é específico para como você está fazendo suas chamadas ajax). Você vai querer pensar sobre como vai lidar com o caso em que uma chamada de ajax nunca é concluída, seja com um erro ou travada por um longo tempo ou expira após um longo tempo.
jQuery Promises
Somando-se a minha resposta em 2014. Hoje em dia, as promessas costumam ser usadas para resolver esse tipo de problema, já que a jQuery's
$.ajax()
já retorna uma promessa e$.when()
avisará quando um grupo de promessas for resolvido e coletará os resultados de retorno para você:ES6 Standard Promises
Conforme especificado na resposta de kba : se você tem um ambiente com promessas nativas integradas (navegador moderno ou node.js ou usando transpile babeljs ou usando um polyfill de promessa), então você pode usar promessas especificadas no ES6. Consulte esta tabela para suporte ao navegador. As promessas são suportadas em praticamente todos os navegadores atuais, exceto o IE.
Se
doAjax()
retornar uma promessa, você pode fazer o seguinte:Se você precisar transformar uma operação assíncrona sem promessa em uma que retorne uma promessa, poderá "prometê-la" assim:
E, em seguida, use o padrão acima:
Bluebird Promises
Se você usar uma biblioteca com mais recursos, como a biblioteca de promessa do Bluebird , ela terá algumas funções adicionais integradas para tornar isso mais fácil:
fonte
doAjax()
que retorna uma promessa como uma das opções. A mesma coisa quefetch()
.Verificando a partir de 2015: agora temos promessas nativas no navegador mais recente (Edge 12, Firefox 40, Chrome 43, Safari 8, Opera 32 e navegador Android 4.4.4 e iOS Safari 8.4, mas não Internet Explorer, Opera Mini e versões anteriores do Android).
Se quisermos realizar 10 ações assíncronas e ser notificados quando todas terminarem, podemos usar o nativo
Promise.all
, sem nenhuma biblioteca externa:fonte
Promises.all()
deveria serPromise.all()
.Promise.all()
, o que não inclui versões atuais do IE.Você pode usar o objeto Deferred do jQuery junto com o método when .
fonte
jQuery
que geralmente significa que o OP não queria uma resposta do jQuery.Você pode emular assim:
então, cada chamada assíncrona faz isso:
enquanto em cada chamada assíncrona no final do método, você adiciona esta linha:
Em outras palavras, você emula uma funcionalidade de trava de contagem regressiva.
fonte
Essa é a maneira mais bacana na minha opinião.
Promise.all
FetchAPI
(por algum motivo, Array.map não funciona dentro das funções .então para mim. Mas você pode usar um .forEach e [] .concat () ou algo semelhante)
fonte
return responses.map(response => { return response.json(); })
, oureturn responses.map(response => response.json())
.Use uma biblioteca de fluxo de controle como
after
fonte