Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript readline.question不';t在循环内运行X次_Javascript_Node.js_Readline - Fatal编程技术网

Javascript readline.question不';t在循环内运行X次

Javascript readline.question不';t在循环内运行X次,javascript,node.js,readline,Javascript,Node.js,Readline,Node.js中的readline模块有一些问题。我需要询问客户id的次数与之前的问题回答的次数相同,但它只要求一次 这是我当前的代码: const readline = require('readline'); var prompts = { numEmails: null, customerIds: [], email: null, password: null } const rl = readline.createInterface({ inpu

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)
        })
    }
});
const readline=require('readline');
变量提示={
numEmails:null,
CustomerID:[],
电子邮件:空,
密码:null
}
const rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout
});
//提出新问题
rl.问题('Num电子邮件:',(numEmails)=>{
for(设i=0;i{
prompts.customerId.push(customerId)
})
}
});
当我运行脚本时,在回答我希望循环运行4次之后,它应该询问Id Customer4次,但它只执行一次:


我做错了什么?

这是因为
问题
方法是异步工作的,所以在开始新的
问题之前,您需要等待每个答案。您可以通过以下方式处理该问题

//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()
          }) 
        })
    }
});
//提出新问题
rl.question('Num Emails:',异步(numEmails)=>{
for(设i=0;i{
rl.问题('ID客户'+i+1+':',(客户ID)=>{
prompts.customerId.push(customerId)
解决()
}) 
})
}
});

我正在使用
async/await
语法来处理承诺,您可以在Internet上阅读更多关于它的信息。我的想法是将
问题
呼叫包装成一个
承诺
,然后当我收到回答时,我会解决承诺,这样我们就可以问下一个问题了。

谢谢,这很有效!我已经尝试过使用
async/await
,但是没有办法实现它。所以,我显然需要了解更多。