@input_denis

Как дождаться ввода пользователя прежде чем выполнить асинхронный код?

Всем привет!
Помогите, пожалуйста, разобраться с использованием readline в node.js.

Суть в том, что я делаю парсинг страницы. По какой-то причине не на всех из них удается найти элемент по селектору (это отдельный вопрос, но сейчас про другое). В случае, если элемент, отвечающий за кол-во страниц, не найден, я хочу ввести его через командную строку вручную. Написал код, но скрипт не дожидается ввода параметра, а продолжает выполняться и закономерно отваливается без кол-ва страниц.

Вот код:
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

            const lastPageLink = await this.driver.findElement(By.css('.pager-last a'))
            let count_pages = +lastPageLink.getText()

            if (count_pages !== count_pages) {
                rl.question('Не нашли количество страниц. Установите вручную ', (value) => {
                    count_pages = value
                    rl.close()
                })
            }
            console.log('Total page count: ' + count_pages)
            // Цикл по страницам
            for (let page = this.last_page ? this.last_page : 1; page < count_pages; page++) {
                //update last page
                await this.updateEntity('sites', {last_page: page}, {name: this.SITE}).last_page

                await this.driver.get(`${this.currentCategory.url}?page=${page}`)
                console.log('New page parse: ' + page)
                await this.parsePage()
            }
            // Парсинг завершен, отмечаем в базе
            await this.updateEntity('categories', {parsing: false}, {url: this.currentCategory.url})


Проблема в том, что я не могу просто взять и запихнуть все в rl.question. Во-первых, он будет ругаться, что я использую асинхронный код вне async функции. Во-вторых, получается что я должен задвоить код: указать его для rl.question и указать его для ситуации, когда кол-во страниц удалось получить в штатном режиме.

Как мне сделать так, чтобы скрипт сначала долждался моего ввода и только потом начал выполнять "Цикл по страницам"?
  • Вопрос задан
  • 779 просмотров
Решения вопроса 1
@input_denis Автор вопроса
Вообщем, если кому-то интересно, решил я свою проблему синхронного чтения из командой строки модулем readline-sync
var readlineSync = require('readline-sync');
 
// Wait for user's response.
var userName = readlineSync.question('May I have your name? ');


Прочел про него еще до создания вопроса, но вчера почему-то пакет отдавал 404ую. Сегодня инсталлит без проблем.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Che603000
c 2011 javascript
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

            const lastPageLink = await this.driver.findElement(By.css('.pager-last a'))
            let count_pages = +lastPageLink.getText()

            if (count_pages !== count_pages) {
                rl.question('Не нашли количество страниц. Установите вручную ', (value) => {
                     console.log(value); 
                     // ---------- begin code ----
                     // поместите сюда весь код который использует введенное кол-во страниц 
                    // ----------- end code ----
                    rl.close();
                })
           }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы