Lo pregunto un poco por capricho, ya que no estoy convencido de que esto sea posible debido a la forma en que funciona el tiempo, pero me preguntaba si alguien había encontrado una solución para esto.
¿Sería posible realizar múltiples llamadas asíncronas a diferentes puntos finales de API que dependan entre sí atómicamente? En el sentido de que si uno de ellos falla, ¿ninguno de ellos ejecuta?
Por ejemplo, si necesitáramos hacer 2 solicitudes de API, la primera para hacer un POST de un usuario y la segunda para hacer un POST usando la ID devuelta de la primera solicitud. Sin embargo, si no pudiera completar la segunda solicitud POST, no se crearía el usuario. Sin esta dependencia, usaría de forma predeterminada algo como Promise.all() sin embargo, dado que dependo del resultado de la primera llamada, no creo que este sea el enfoque correcto.
¿Sería posible realizar múltiples llamadas asíncronas a diferentes puntos finales de la API que dependan de cada uno de los otros átomos? En el sentido de que si uno de ellos falla, ¿ninguno de ellos ejecuta?
Sí, a través de un rechazo de promesa.
Digamos que necesita hacer dos operaciones asíncronas secuencialmente (una tras otra). Tu harías:
doA().then(doB); Si doA arroja un error, rechaza la promesa y no se llama a doB . Luego puede detectar el error y manejarlo de la forma que necesite. Con funciones async harías:
(async function(){ let a = await doA(); let b = await doB(a); })(); Lo cual nuevamente, si doA arroja un error, entonces la llamada doB no ocurre.
Puede hacer que doA y doB arrojen diferentes tipos de error para manejarlos de manera diferente (si es necesario, como por ejemplo... hacer una reversión en A si B falla).
class DoAError extends Error { }; class DoBError extends Error { }; async function doA(){ //... //... throw new DoAError(); //... } async function doB(){ //... //... throw new DoBError(); //... }Y luego lo manejas así:
(async function(){ try { let a = await doA(); let b = await doB(a); } catch(e){ if(e instanceof DoAError){ /* something wrong with DoA */ } else if(e instanceof DoBError){ /* something wrong with DoB */ } else { throw e; } } })();No necesita hacer nada especial para manejar este caso. Prueba esto:
endfunc() al final de cada función de llamada API,endcall() si cada bandera está configurada.Coloca las banderas...
var api1 = api2 = false;Defina sus funciones de llamada API...
apicall1() { // do api call api1 = true; endfunc(); } apicall2() { // do another api call api2 = true; endfunc(); }Y rematar todo con un...
endfunc() { if(api1 !== true && api2 !== true) { return; } // stuff to execute only after all API calls are done }`