Node.js读取行暂停代码



抱歉,我刚刚涉足 JavaScript,目前正在尝试从控制台收集用户输入。我有一个看起来像这样的代码:

main = () => {
var num = getInput();
console.log(num);
}
getInput = () => {
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Lemme test: ', (ans) => {
rl.close();
return ans;
});
}
main();

因此,如果我尝试运行它,它将显示:

Lemme test: undefined

然后等待我输入。显然,console.log(num);getInput();完成之前就跑了,或者getInput();吐出一个undefined然后征求意见。

顺便说一句,切换rl.close();return ans;不起作用。

为什么会这样?

发生这种情况是因为 node 不等待 readline 获取输入 - 就像 Node 中的几乎所有内容一样,它是异步的。因此,它会触发用户输入请求并继续程序。一旦有一些用户输入,如果触发了你给它的回调。因此,要解决此问题,您需要在回调中管理use输入,或者在回调中调用一个函数来异步处理输入。例如:

main = () => {
var num = getInput();
}
dealWithInput = (str) => {
console.log(str)
}
getInput = () => {
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Lemme test: ', (ans) => {
rl.close();
dealWithInput(ans);
});
}
main();

这是因为getInput函数是一个回调,这意味着它会在未来的某个时候执行,因此console.log(不是回调(在之前执行。

一个函数或方法,当你把它分配给另一个函数时,它是一个回调,如下所示:

let example = () => {
// This is a callback
}
doSomething(result => {
// This is a callback too because its the same as doing the following
})
doSomething(function(result){
// This is a callback without arrow functions
})

最新更新