Estoy tratando de obtener datos de una llamada de función y los mantengo en un ciclo while para que la función se llame una y otra vez si no se reciben los datos. Lo que quise decir con los datos es que las matrices data1, data2 y data3 que devolví de la función getData deben completarse y no tener un valor nulo. Pero no soy capaz de encontrar la solución.
Aquí está mi código:
router.get('/someurl' , async(req,res) => { let data = []; while(data.length == 0) { data = await functionCall() console.log(data) } })Y aquí está el formato de mi código functionCall:
const unirest = require("unirest"); const cheerio = require('cheerio') const getData = async() => { const data1 = [] , data2 = [] , data3 = [] ; try { const response = await unirest .get('url') .headers({'Accept': 'application/json', 'Content-Type': 'application/json'}) .proxy("proxy") const $ = cheerio.load(response.body) $('hided').each((i,el) => { data1[i] = $(el) .find('hided') .text() data2[i] = $(el) .find('hided') }) $('hided').each((i,el) => { data3[i] = $(el) .find('hided') .text() }) if(data1.length && data2.length && data3.length)) { return [data1 , data2 , data3] } } catch(error) { console.log("Error" , error); } return []; } module.exports = getDataSuponiendo que fetchData es una llamada a la API, no hay motivo para definir data inicialmente. Simplemente puede registrar los resultados de llamar a esa API hasta que los resultados sean una matriz vacía.
const data = [1, 2, 3, 4]; // A simple API that returns a reduced array // on every call function mockApi() { return new Promise(res => { setTimeout(() => { res([...data]); data.shift(); }, 1000); }); } // Call the API, and if the the response // has zero length log "No data" otherwise // log the data, and call the function again. async function fetchData() { const data = await mockApi(); if (!data.length) { console.log('No data'); } else { console.log(data); fetchData(); } } fetchData();En primer lugar, elimine la declaración if, ya que es literalmente lo que está haciendo el ciclo while. luego elimine await, ya que esto no está en una función asíncrona, y generará un error.
Prueba algo como esto.
const fetchData = async ()=>{ data = await functionCall() if(data.length==0){ fetchData() }else{ return} }