Si mi función usa dos operaciones asíncronas independientes, entonces un backend inalcanzable entre la primera y la segunda operación daría como resultado a (almacenado) b (no almacenado).
try { const a = await createA(); // error: backend not available const b = await createB(); } Podría usar await Promise.all() , para esperar hasta que se resuelvan todas las promesas, de modo que se almacenen ambas o no se almacene ninguna.
await Promise.all([createA(), createB()]);Pero cómo resolver esta situación, si mi segunda operación asíncrona depende del resultado de la primera.
try { const a = await createA(); // error: backend not available const b = await createB({ _id: a._id }); } ¿Hay alguna forma de manejar esto usando asíncrono y esperar y no declaraciones .then() encadenadas?
Editar: espero que se creen a y b o ninguno de ambos. Ambas operaciones a y b guardan documentos a través del controlador mongoose en una base de datos mongodb.
Desea crear un promisePipe en lugar de usar reduce . Con reduce puede usar la salida de la operación anterior como entrada para la siguiente operación.
Por ejemplo:
const myPromise = async n => { return Promise.resolve(1 * n) } const myPromise2 = async n => { return Promise.resolve(2 * n) } const promiseReduce = async (prevPromise, currPromise) => { const prevResult = await prevPromise; return currPromise(prevResult).catch(err => { throw err // throw a internal error server here }); } const promisePipe = (...fns) => { return fns.reduce(promiseReduce, Promise.resolve(1)) } promisePipe(myPromise, myPromise2).then(e => { console.log(e)})si la segunda función depende del primer resultado, puede usar el siguiente fragmento:
try { const a = await createA(); // null and if id is exists than call createB if (a && a.id) { const b = await createB(); } }