Espero que el siguiente fragmento de código sea suficiente para explicar mi problema:
function getChildrensRoomsProductNumbers(uuids, callback) { var productNumbers = []; uuids.forEach(uuid => getProductNumber(uuid, function(productNumber){ productNumbers.push(productNumber);})) callback(productNumbers); } Entonces, para una matriz de uuids, me gustaría solicitar los números de producto correspondientes de una tienda en línea y almacenarlos en la matriz productNumbers que luego me gustaría pasar a una función principal para una mayor manipulación llamando a callback(productNumbers)
La solicitud en sí se realiza en la función getProductNumber .
Sin embargo, no entiendo por qué la matriz productNumbers está vacía. Sé que forEach no devuelve nada, por eso preparé una matriz de antemano que debería completarse con mi idea.
Soy relativamente nuevo en NodeJS/JavaScript, por lo que probablemente me falten algunos conceptos básicos aquí.
Esta es la función getProductNumber :
function getProductNumber(uuid, callback){ getToken(function(err, token){ var headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', }; const options = { url: BASE_URL + 'api/product/' + uuid, method: 'GET', headers: headers }; axios.request(options) .then(res => { console.log("NUmber: " + res.data.data.productNumber); callback(res.data.data.productNumber); }) .catch(err => { console.error(err.response); }); }) }primero aprenda el estilo async/await para deshacerse de las devoluciones de llamada
entonces esto será factible:
async function getChildrensRoomsProductNumbers(uuids) { var productNumbers = []; for (let uuid of uuids) { const productNumber = await getProductNumber(uuid); productNumbers.push(productNumber); } return productNumbers; }como dijo la gente en los comentarios, parece que getProductNumber hace un trabajo asíncrono. Si desea seguir con las devoluciones de llamada, puede usar https://www.npmjs.com/package/async para activar una devolución de llamada cuando finalice el bucle.
Gracias a @Raphael PICCOLO por señalar la función util.promisify .
Sobre esa base, prometí la función que tengo para obtener el token de la API de la tienda y hacer que el resto funcione con async/await, así:
const awaitablegetToken = util.promisify(getToken); async function getChildrensRoomsProductNumbers(uuids) { var productNumbers = []; var accessToken = await awaitablegetToken(); for (const uuid of uuids){ const productNumber = await getChildrensRoomsProductNumber(uuid, accessToken) productNumbers.push(productNumber); } return productNumbers; }