Асинхронный цикл для в Javascript - PullRequest
1 голос
/ 22 октября 2019

Я пытаюсь выполнить итерацию и распечатать по порядку массив в Javascript, который содержит заголовок 2 событий, которые я получил в результате просмотра веб-страниц на веб-сайте, но он распечатывается в беспорядке. Я знаю, что Javascript асинхронный, но я новичок в этом мире асинхронизма. Как я могу реализовать цикл для , чтобы распечатать массив по порядку и дать настроенную информацию?

agent.add('...') похоже на console.log('...'). Я делаю чат-чат с DialogFlow и NodeJs 8, но это сейчас не важно. Я использовал console.log () в ответ только для отладки.

Я попробовал следующее:

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

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

Но я получил эту ошибку Ошибка неожидана await внутри цикла без ожидания в цикле

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)
        })

}

Я хотел бы всегда распечатывать заголовок события № 1 и после заголовка события № 2. Примерно так:

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

Спасибо за любую помощь и объяснения!

1 Ответ

0 голосов
/ 22 октября 2019

Здесь нет асинхронного случая, но если вам все еще трудно, чем использовать этот цикл

for (let index = 0; index < eventsTitles.length; index++) { const element = eventsTitles[index]; agent.add( $ {index}. $ {Элемент} ) }

...