Descubro que no puedo obtener la respuesta cuando promise.all .
Los orders a continuación deben ser una matriz.
Promise.all(promises).then(function (orders) { console.log(orders); // nothing logged });código completo
let promises = markets.map(async (mkt) => { return new Promise(async function (resolve, reject) { return functionA(paramA) .then(resA => { return res.functionB() .then((resB) => { if (resB.length > 0) { return functionC() .then(resC => { console.log(resC); // successfully logged return resC; }); } }); }) .catch(err => console.log(err)); }); }); Promise.all(promises).then(function (orders) { console.log(orders); // nothing logged });¿Cómo puedo arreglar?
Actualización 1
Actualizo el código basado en el comentario.
Los orders ahora están regresando.
(54) [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, Array(1), undefined, undefined, undefined, undefined, undefined, undefined, undefined, Array(1), undefined, Array(1), undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined] ¿Cómo puedo hacer que la promesa regrese sin undefined ?
const promises = markets.map(async mkt => { const resA = await functionA(paramA); const resB = await res.functionB(); if (resB.length > 0) { const resC = await functionC() console.log(resC); // successfully logged return resC; } }); Promise.all(promises).then(orders => { console.log(orders); // nothing logged }, err => { console.log(err); });resolve a ningún lado const promises = markets.map((mkt) => { return functionA(paramA) .then(resA => res.functionB()) .then((resB) => { if (resB.length > 0) { return functionC() .then(resC => { console.log(resC); // successfully logged return resC; }); } }) .catch(handleError); }); Un mejor enfoque sería utilizar await para hacer que el código sea plano y fácil de leer.
const promises = markets.map(async (mkt) => { try { const resA = await functionA(paramA); const resB = await res.functionB(); if (resB.length > 0) { const resC = await functionC() return resC; } } catch (e) { // handle errors } }); También podría considerar el manejo de errores en Promise.all , no en el asignador.
Si desea incluir solo elementos para los que se llama a functionC , filtre los valores vacíos después.
Promise.all(promises).then(function (orders) { const filtered = orders.filter(Boolean); console.log(filtered); });Bueno, nunca resolve() o reject() las new Promise que estás creando. ¡Evite el antipatrón del constructor Promise y nunca pase una async function como ejecutora de la new Promise !
Este código se puede simplificar en gran medida mediante el uso consiguiente de async / await en lugar de .then() :
const promises = markets.map(async mkt => { const resA = await functionA(paramA); const resB = await res.functionB(); if (resB.length > 0) { const resC = await functionC() console.log(resC); // successfully logged return resC; } }); Promise.all(promises).then(orders => { console.log(orders); // nothing logged }, err => { console.log(err); });