Descubrí que no puedo resolver las promesas una por una.
este es mi codigo
const promises = mkt.map((marketItem) => { return context.program.account.chain .fetch(marketItem[0].instrument) .then((instrumentRes) => { return Test(context, marketItem[0]).then( testResult => { return Promise.all([ functionA(), functionB(), ]).then((result) => { return result }); } ); }); }); console.log(promises) for (let i=0; i < promises.length; i++) { const val = await promises[i](); console.log(val); }error
promises[i]() is not a function¿Por qué? ¿Cómo puedo solucionarlo?
promises[i]() is not a function
Correcto, esto se debe a que las promises son una matriz de objetos Promise , no funciones.
Puede volcar esta matriz de promises en Promise.all y esperar a que se resuelvan todas.
Promise.all(promises) .then(resolvedPromises => { // handle array of resolved promises });pero estoy trabajando en algunas cosas de actualización en tiempo real. Si uso
Promise.allarrojará un errorToo many request, así que quiero hacerlo uno por uno para ver el efecto
Para esto, creo que desea iterar en la matriz mkt y esperar a que se resuelva cada Promesa creada. Refactorice la devolución de llamada de asignación en una función independiente que puede invocar manualmente dentro del ciclo for, esperando que se establezca la Promesa.
const request = (marketItem) => { return context.program.account.chain .fetch(marketItem[0].instrument) .then((instrumentRes) => Test(context, marketItem[0])) .then(testResult => Promise.all([functionA(), functionB()])) .then((result) => result); } for (let i=0; i < mkt.length; i++) { try { const val = await request(mkt[i]); console.log(val); } catch(error) { // handle any error } }Simplemente eliminar el () de la llamada en espera ya debería funcionar.
const val = await promises[i]; Sin embargo, tenga en cuenta que todas las promesas ya se "comenzaron" (no conozco una palabra mejor para eso) en ese momento y solo está recuperando los resultados o un error con la llamada en await .