У меня проблемы с модулем readline в Node.js. Мне нужно запрашивать идентификатор клиента столько раз, сколько в предыдущем ответе на вопрос, но он запрашивает его один раз.

Это мой текущий код:

const readline = require('readline');
var prompts = {
    numEmails: null,
    customerIds: [],
    email: null,
    password: null
}

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });

//Ask for new question
rl.question('Num Emails: ', (numEmails) => {
    for(let i = 0; i<numEmails; i++) {
        //Ask for new question
        rl.question('Id Customer' + i+1 + ': ', (customerId) => {
            prompts.customerIds.push(customerId)
        })
    }
});

Когда я запускаю скрипт, после ответа я хочу, чтобы цикл выполнялся 4 раза, он должен запросить идентификатор клиента 4 раза, но делает это только один раз:

enter image description here

Что я делаю не так?

1
user10021033 20 Май 2021 в 15:03

1 ответ

Лучший ответ

Это происходит потому, что метод question работает асинхронно, поэтому вам нужно ждать каждого ответа, прежде чем начинать новый question. Вы можете справиться с этим следующим образом.

//Ask for new question
rl.question('Num Emails: ', async (numEmails) => {
    for (let i = 0; i<numEmails; i++) {
        // Wait for a question to be answered. 
        await new Promise((resolve) => {
          rl.question('ID Customer ' + i+1 + ': ', (customerId) => {
            prompts.customerIds.push(customerId)
            
            resolve()
          }) 
        })
    }
});

Я использую синтаксис async/await для работы с обещаниями, вы можете прочитать об этом больше в Интернете. Идея состоит в том, что я превратил вызов question в Promise, а затем, когда я получаю ответ, я разрешаю обещание, поэтому мы зададим следующий вопрос.

2
Ayzrian 20 Май 2021 в 12:09