Estoy tratando de iterar e imprimir en orden una matriz en Javascript que contiene el título de 2 eventos que obtuve al hacer web scraping en un sitio web, pero se imprime en desorden. Sé que Javascript es asincrónico, pero soy nuevo en este mundo de asincronismo. ¿Cómo puedo implementar el bucle para para imprimir la matriz en orden y proporcionar información personalizada?

agent.add('...') es como console.log('...'). Estoy haciendo un chatbot con DialogFlow y NodeJs 8 pero eso no es importante en este momento. Usé console.log () en la devolución solo para depurar.

Probé el siguiente:

async function printEvent(event){
    agent.add(event)
}

async function runLoop(eventsTitles){
    for (let i = 0; i<eventsTitles.length; i++){
       aux = await printEvent(eventsTitles[i])
    }
}    

Pero recibí este error error inesperado await dentro de un bucle sin espera en bucle

async function showEvents(agent) {
    const cheerio = require('cheerio');
    const rp = require('request-promise');
    const options = {
        uri: 'https://www.utb.edu.co/eventos',
        transform: function (body) {
            return cheerio.load(body);
        }
    }

    return rp(options)
        .then($ => {

            //** HERE START THE PROBLEM**
            var eventsTitles = [] // array of event's titles
            agent.add(`This mont we have these events available: \n`)
            $('.product-title').each(function (i, elem) {
                var event = $(this).text()
                eventsTitles.push(event)
            })
            agent.add(`${eventsTitles}`) // The array prints out in order but if i iterate it, it prints out in disorder.

            // *** IMPLEMENT LOOP FOR ***

            agent.add(`To obtain more info click on this link https://www.utb.edu.co/eventos`)
            return console.log(`Show available events`);

        }).catch(err => {
            agent.add(`${err}`)
            return console.log(err)
        })
        
}

Me gustaría imprimir siempre el título n. ° 1 del evento y después del título n. ° 2 del evento. Algo como esto:

events titles.forEach((index,event) => {
    agent.add(`${index}. ${event}`) // remember this is like console.log(`${index}. ${event}`)
})

¡Gracias por cualquier ayuda y explicación!

1
German Jr 22 oct. 2019 a las 09:38

1 respuesta

La mejor respuesta

No hay ningún caso asincrónico aquí, pero si aún tiene dificultades, use este bucle

for (let index = 0; index < eventsTitles.length; index++) { const element = eventsTitles[index]; agent.add( $ {index}. $ {element} ) }

1
Ankur Patel 22 oct. 2019 a las 07:06