Tenho várias chamadas de API a serem feitas, que buscam por uma API, gravam dados no DB via API, enviam a saída para o front-end por outra API.
Eu escrevi função assíncrona com aguardar como abaixo -
Os dois primeiros devem ser executados um após o outro, mas o terceiro pode ser executado de forma independente e não é necessário aguardar a conclusão das duas primeiras instruções de busca.
let getToken= await fetch(url_for_getToken);
let getTokenData = await getToken.json();
let writeToDB = await fetch(url_for_writeToDB);
let writeToDBData = await writeToDB.json();
let frontEnd = await fetch(url_for_frontEnd);
let frontEndData = await frontEnd.json();
Qual é a melhor maneira de lidar com essas múltiplas instruções de busca?
javascript
async-await
fetch
Yasar Abdullah
fonte
fonte
Promise.all
, mas neste caso, eu imagino que seria mais limpo (e mais fácil de construir no futuro) se ele encerrasse tudo em umaPromise.all
chamada, especificamente para tratamento de erros.Promise.all
é essencial para o tratamento adequado dos erros e aguardar a conclusão das promessas de primeiro, segundo e terceiro.Respostas:
Existem várias maneiras, mas a mais universal é agrupar cada caminho de código assíncrono em uma função assíncrona. Isso permite flexibilidade de misturar e combinar valores de retorno assíncronos, como desejar. No seu exemplo, você pode até embutir código com o iyn assíncrono:
fonte
Você pode usar
.then()
, em vez de esperar:fonte
Promise.all
neles e devolvê-los ao chamador.É mais fácil se você trabalhar com "criadores" promissores (= função que retorna promessas) em vez de promessas brutas. Primeiro, defina:
que retorna um "criador". Agora, aqui estão dois utilitários para encadeamento serial e paralelo, que aceitam promessas brutas e "criadores":
Então, o código principal pode ser escrito assim:
Se você não gostar do wrapper "criador" dedicado, poderá definir
fetchJson
normalmentee use continuações em linha exatamente onde
series
ouparallel
são chamadas:Para levar a idéia adiante, podemos criar
series
eparallel
devolver "criadores", em vez de promessas. Dessa forma, podemos construir "circuitos" aninhados arbitrários de promessas seriais e paralelas e obter os resultados em ordem. Exemplo de trabalho completo:fonte
fetchJson
? Não vejo nenhum benefício em cumprir uma promessa com outra função. E a utilidade deseries
é questionável, pois a próxima função de uma série normalmente requer o valor de retorno das funções anteriores.series(promiseA, promiseB)
serão iniciadasA
eB
ao mesmo tempo.series
. Prefiro preferir uma vida assíncrona para sequências ePromise.allSettled
nãoparallel
.Execute request independente (
writeToDB
) no início e semawait
fonte
await
possui tratamento de erros embutido - quando a promessa rejeita, você recebe uma exceção, a promessa retornada pelaasync function
chamada será rejeitada e o chamador notará. Se você sugerir descartar aawait
palavra - chave e executar a cadeia de promessas de forma independente, não deve fazê-lo sem pensar em manipulação de erros. Uma resposta que pelo menos não a menciona (ou preserva o comportamento original do chamador recebendo uma rejeição) é uma resposta ruim.