Así que tengo esta función que hace 4 cosas, que deben secuenciarse de la siguiente manera:
- promise1 - promiseAfter1 // In parallel - promise2 - promiseAfter2Para obtener las promesas en serie escribiré:
async sequence1() { const result = await promise1(); const finalResult = await promiseAfter1(result); } async sequence2() { const result = await promise2(); const finalResult = await promiseAfter2(result); }Y entonces:
async finalSequence() { await Promise.all([sequence1, sequence2]); } Pero para lograr esto, tuve que crear dos subfunciones ( sequence1 y sequence2 ) que me gustaría evitar para la legibilidad del código, entre otras razones.
¿Hay alguna manera de lograr el mismo resultado sin tener que crear dos subfunciones?
¿No debería haber algo como Promise.sequence que resuelva secuencialmente las promesas?
Esto escribiría:
Promise.all([ Promise.sequence([promise1, promiseAfter1]), Promise.sequence([promise2, promiseAfter2]), ])Salud
Pero para lograr esto, tuve que crear dos subfunciones (
sequence1ysequence2) que me gustaría evitar para la legibilidad del código, entre otras razones.
Diría que es más legible con esas funciones, en lugar de menos, siempre que les dé nombres significativos. Pero es una cuestión de opinión.
¿No debería haber algo como
Promise.sequenceque resuelva secuencialmente las promesas?
No, realmente no; no encaja con los otros combinadores de promesas ( Promise.all , etc.). Lo que pasa con los combinadores de promesas es que funcionan con promesas , pero su Promise.sequence necesitaría trabajar con funciones en su lugar. Recuerde que Promise.all , etc., no hace que suceda nada que no hubiera sucedido ya, solo observa y combina los resultados de las cosas que se completan. Para eso están las promesas: Observar los resultados de los procesos asincrónicos.
Sin embargo, hay algo incorporado para hacer las cosas en secuencia, algo que toma funciones: then
async finalSequence() { await Promise.all([ promise1().then(promiseAfter1), promise2().then(promiseAfter2), ]); }O si no desea pasar los resultados de uno a otro, puede usar funciones en línea:
// Either async finalSequence() { await Promise.all([ promise1().then(() => promiseAfter1()), promise2().then(() => promiseAfter2()), ]); } // Or async finalSequence() { await Promise.all([ (async () => { await promise1(); await promiseAfter1(); })(), (async () => { await promise2(); await promiseAfter2(); })(), ]); } (Esos difieren ligeramente en términos de lo que termina en la matriz de Promise.all , pero no está usando esa matriz, así que...)
Pero si desea escribir una sequence (por ejemplo, suponiendo que las funciones se deben llamar sin argumentos) para colocarla en su biblioteca de utilidades estándar (todos tenemos una, ¿no? :-)), es fácil de hacer:
async function sequence(functions) { for (const fn of functions) { await fn(); } } Entonces, como dices, finalSequence sería:
async finalSequence() { await Promise.all([ sequence(promise1, promiseAfter1), sequence(promise2, promiseAfter2), ]); }