Tengo el siguiente código en el nodo (principiante), quiero llamar a una función después de que todo el código se haya ejecutado en el ciclo, sé que tengo que usar promesas, pero no sé cómo aplicarlas en esta situación . El código se ha simplificado. Muchas gracias.
const axios = require('axios').default; axios.post('url', { params: {} }).then(response=>{ var objResponse = response.data Object.keys(objResponse).forEach(function (key){ axios.post('url', { params: {} }).then(response=>{ var n=0; getCode(n); }) }) **finishFunction**() }) function getCode(n) { axios.post('url', { params: {} }).then(response=>{ if(response.data){ if (response.data.code) { getData(); }else{ if (n < 10) { n++; getCode(n); } else { getTimeout(); } } } }) } function getTimeout() { axios.post('url', { params: {} }) } function getData() { axios.post('url', { params: {} }).then(response=>{ console.log('finished one loop'); }) }
La mejor manera de lograr lo que desea es usar async/await con un bucle for normal.
Aquí hay un ejemplo de lo que quiero decir. Puedes ajustarlo a tus necesidades:
async doSomeStuff() { const results = [] const res1 = await axios.post('url', { params: {} }) // assuming res1 is an Array for (let i=0; i < res1.length; i++) { const result = await axios.post('url2', { params: {} }) results.push(result) } return results }
También puede llamar a otras funciones asíncronas dentro del ciclo como lo está haciendo.
Puede usar Promise all y map
juntos, junto con async/await
async function myFunction(){ const result = await axios.post('url'); const keys = Object.keys(result.data); const requests = keys.map((key, i) => axios.post('url')/*chain more if u need*/) const allResults = await Promise.all(requests); // All done run your function below }
Si está satisfecho con que cada elemento del ciclo se ejecute al mismo tiempo, puede usar una matriz de promesas y esperar a que finalice todo en la matriz. Luego, solo tiene que agregar promesas a sus funciones, lo que llevará una cantidad de tiempo desconocida para ejecutarse. Algo como esto podría ayudarlo a comenzar:
const axios = require('axios').default; axios.post('url', { params: {} }).then(response=>{ var objResponse = response.data var proms = []; Object.keys(objResponse).forEach(function (key){ proms.push( axios.post('url', { params: {} }).then(response=>{ var n=0; return getCode(n); }) ) }) var items = Promise.all(proms); items.then(function (results) { // **finishFunction**() }); }) function getCode(n) { return new Promise(function (resolve, reject) { axios.post('url', { params: {} }).then(response=>{ if(response.data){ if (response.data.code) { getData(); }else{ if (n < 10) { n++; getCode(n).then(data => { return resolve(data) }); } else { getTimeout().then(data => { return resolve(data) }); } } } }) }) } function getTimeout() { return new Promise(function (resolve, reject) { axios.post('url', { params: {} }) return resolve() }) } function getData() { return new Promise(function (resolve, reject) { axios.post('url', { params: {} }).then(response=>{ console.log('finished one loop'); return resolve(response) }) }) }