Tengo que realizar varias llamadas a la API que se obtienen a través de una API, escriben datos en la base de datos a través de la API, envían resultados al front-end a través de otra API.
He escrito la función asincrónica con esperar como a continuación:
Los primeros 2 deben ejecutarse uno tras otro, pero el tercero puede ejecutarse independientemente y no es necesario esperar a que se completen las primeras 2 declaraciones de captación.
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();
¿Cuál es la mejor manera de manejar tales declaraciones de búsqueda múltiple?
javascript
async-await
fetch
Yasar Abdullah
fuente
fuente
Promise.all
, pero en este caso me imagino que sería más limpio (y más fácil de construir en el futuro) si completara todo en unaPromise.all
llamada, específicamente para el manejo de errores.Promise.all
es esencial para el manejo adecuado de errores y esperar a que se cumplan las promesas primero, luego segundo y tercero.Respuestas:
Hay muchas formas, pero la más universal es ajustar cada ruta de código asíncrono en una función asíncrona. Esto le brinda flexibilidad de mezclar y combinar valores de retorno asíncronos como desee. En su ejemplo, incluso puede codificar en línea con async iife's:
fuente
Puede usar
.then()
, en lugar de esperar:fuente
Promise.all
ellos, y devolverlos a la persona que llama.Es más fácil si trabaja con "creadores" de promesas (= función que devuelve promesas) en lugar de promesas en bruto. Primero, defina:
que devuelve tal "creador". Ahora, aquí hay dos utilidades para el encadenamiento en serie y paralelo, que aceptan tanto promesas en bruto como "creadores":
Entonces, el código principal se puede escribir así:
Si no le gusta el contenedor "creador" dedicado, puede definir
fetchJson
normalmentey use continuaciones en línea justo donde
series
oparallel
se llaman:Para llevar la idea más allá, podemos hacer
series
yparallel
devolver "creadores", así como promesas. De esta manera, podemos construir "circuitos" anidados arbitrarios de promesas en serie y paralelas y obtener los resultados en orden. Ejemplo de trabajo completo:fuente
fetchJson
? No puedo ver ningún beneficio al envolver una promesa con otra función. Y la utilidad deseries
es cuestionable ya que la siguiente función de una serie generalmente requiere el valor de retorno de la (s) función (es) anterior (es).series(promiseA, promiseB)
lo tanto , comenzaránA
yB
al mismo tiempo.series
. Prefiero preferir async iife para secuencias y enPromise.allSettled
lugar deparallel
.Ejecute una solicitud independiente (
writeToDB
) al principio y sinawait
fuente
await
tiene incorporado el manejo de errores: cuando la promesa se rechaza, se obtiene una excepción, la promesa devuelta por laasync function
llamada se rechazará y la persona que llama se dará cuenta. Si sugiere eliminar laawait
palabra clave y ejecutar la cadena de promesa de forma independiente, no debe hacerlo sin pensar en el manejo de errores. Una respuesta que al menos no lo menciona (o conserva el comportamiento original de la persona que llama que recibe un rechazo) es una mala respuesta.