Estoy tratando de escribir algo como esto pero no puedo resolver las promesas internas.
const traceSamplesRequests = transactionTypes.map(async (transactionType) => { // This part should be synchronous since we need transactionNames const transactionNames = await api.getTransactionNames(); return transactionNames.map((transactionName) => api.getTraceSamples()); });Y quiero escribir con funciones lambda con Promise.all bucles no imperativos.
Por lo tanto, .map() no tiene en cuenta las promesas. Llama a la devolución de llamada y simplemente recopila diligentemente el valor de retorno de la devolución de llamada y avanza a la siguiente iteración del ciclo. Dado que su devolución de llamada es async con una await en ella, ese valor de retorno es una promesa no resuelta. Entonces, lo que obtienes de .map() es una serie de promesas.
Por lo tanto, no hay forma de usar .map() o cualquiera de los métodos de iteración de matrices sin usar algo para esperar las promesas.
Parece que ya lo sabe, pero con el código que tiene, insertaría dos Promise.all() :
const traceSamplesRequests = await Promise.all(transactionTypes.map(async (transactionType) => { // This part should be synchronous since we need transactionNames const transactionNames = await api.getTransactionNames(); return Promise.all(transactionNames.map((transactionName) => api.getTraceSamples())); })); Eso le daría una matriz de valores (y la función principal tendría que ser async ). Esto ejecutará todas las operaciones asincrónicas en el ciclo en paralelo (todas en vuelo al mismo tiempo).
Sus otras opciones son usar un ciclo for o while que suspenderá la iteración del ciclo para cada await y ejecutará sus operaciones asincrónicas en secuencia (la segunda iteración del ciclo no se ejecuta hasta que se completa la primera).
O bien, puede escribir algún tipo de función de ayuda que sería una versión consciente de la promesa de .map() . Sin embargo, probablemente usaría for o .map() con Promise.all() dentro de la función auxiliar.
La biblioteca de promesa Async tiene múltiples funciones auxiliares como opciones para usar. Están diseñados para funcionar con promesas o devoluciones de llamada simples.
De hecho, lo hice funcionar así:
const traceSamplesRequests = await Promise.all( transactionTypes.map(async (transactionType) => { const transactionNames = await api.getTransactionNames({ transactionType }); return await Promise.all(transactionNames.map((transactionName) => api.getTraceSamples({ transactionType }))); }) );