readline.question 不会在循环内 运行 X 次
readline.question doesn't run X times inside the loop
我在使用 Node.js 中的 readline
模块时遇到了一些问题。我需要像之前的问题回复一样多次询问客户 ID,但它只询问一次。
这是我当前的代码:
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 次后,它应该询问 Id Customer 4 次,但只执行一次:
我做错了什么?
发生这种情况是因为 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
语法来处理 promises,您可以在 Internet 上阅读更多相关信息。我的想法是,我将 question
调用包装到 Promise
中,然后当我收到答案时,我解决了承诺,因此我们将提出下一个问题。
我在使用 Node.js 中的 readline
模块时遇到了一些问题。我需要像之前的问题回复一样多次询问客户 ID,但它只询问一次。
这是我当前的代码:
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 次后,它应该询问 Id Customer 4 次,但只执行一次:
我做错了什么?
发生这种情况是因为 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
语法来处理 promises,您可以在 Internet 上阅读更多相关信息。我的想法是,我将 question
调用包装到 Promise
中,然后当我收到答案时,我解决了承诺,因此我们将提出下一个问题。