Nodejs求助 如何在 Node.js 中实现非异步的用户输入
Nodejs求助 如何在 Node.js 中实现非异步的用户输入
初学 Node.js ,遇到了这样一个问题,我定义了一个函数用来接收用户输入,
var inputMove = function() {
var move;
var readline = require('readline');
var rl = readline.createInterface({
input:process.stdin, output:process.stdout
});
rl.setPrompt('input your move:');
rl.prompt();
rl.on('line', function(line) {
move = line.trim().split(',').map(function(val) {
return parseInt(val);
})
console.log(move);
rl.close();
});
rl.on('close', function() {
process.exit(0);
});
return move;
}
move = inputMove();
console.log(move);
不过,由于异步特性,最后一行的输出会是 undefined ,我要怎么做才能得到正确的值呢?
javascript<br>var inputMove = function(callback) {<br> var move;<br> var readline = require('readline');<br> var rl = readline.createInterface({<br> input:process.stdin, output:process.stdout<br> });<br> rl.setPrompt('input your move:');<br> rl.prompt();<br> rl.on('line', function(line) {<br> move = line.trim().split(',').map(function(val) {<br> return parseInt(val);<br> })<br> callback(move);<br> rl.close();<br> });<br> rl.on('close', function() {<br> process.exit(0);<br> });<br> return move;<br>}<br>inputMove(function() {});<br>console.log(move); <br>
上面那条回复手滑发出去了,下面这样:javascript<br>var inputMove = function(callback) {<br> var move;<br> var readline = require('readline');<br> var rl = readline.createInterface({<br> input:process.stdin, output:process.stdout<br> });<br> rl.setPrompt('input your move:');<br> rl.prompt();<br> rl.on('line', function(line) {<br> move = line.trim().split(',').map(function(val) {<br> return parseInt(val);<br> })<br> callback(move);<br> rl.close();<br> });<br> rl.on('close', function() {<br> process.exit(0);<br> });<br> return move;<br>}<br>inputMove(function(move) {<br> console.log(move); <br>});<br><br>
其实还有更优雅的 async await 大法,可以去看看阮一峰的 es6 介绍
谢谢啦,很有用。
callback 思维反人类吧😄,早用协程早解脱,当然对新手来说,协程也没有那么容易理解。
说得那么厉害的样子,可惜毫无用处。
async.js
用 Promise 也比较清楚。
放开我来
ES7 babel 版
function inputMove(){
return new Promise(function(resolve){
var readline = require(‘readline’);
var rl = readline.createInterface({
input:process.stdin, output:process.stdout
});
rl.setPrompt(‘input your move:’);
rl.prompt();
rl.on(‘line’, function(line) {
var move = line.trim().split(’,’).map(function(val) {
return parseInt(val);
})
rl.close();
resolve(move);
});
rl.on(‘close’, function() {
process.exit(0);
});
})
}
async function main(){
var move = await inputMove();
console.log(move);
}
main().catch(e => console.error(e.stack || e));
哎呀~这 V2EX 回复~感觉像吃了翔一样…
这大概是为什么 V2EX 技术讨论很少的原因了,回复里的代码看着会想死 😂
这贴应该放在 cnodejs,应该是更多人帮你解决
在 Node.js 中实现非异步的用户输入,通常是指在命令行(CLI)环境下同步地获取用户输入。Node.js 的原生 readline
模块默认是异步的,但你可以通过一些技巧实现类似同步的行为。以下是一个使用 readline-sync
库的示例,该库提供了更直接的同步 API 来获取用户输入:
首先,你需要安装 readline-sync
库:
npm install readline-sync
然后,你可以在你的 Node.js 脚本中使用它:
const readlineSync = require('readline-sync');
function getUserInput() {
console.log('请输入一些内容:');
const input = readlineSync.question(); // 同步获取用户输入
return input;
}
function main() {
const userInput = getUserInput();
console.log('你输入的是: ' + userInput);
}
main();
如果你坚持使用 Node.js 原生的 readline
模块来实现类似功能,虽然不能直接同步,但可以通过递归调用或者事件驱动的方式模拟同步行为。不过,这种方法通常不推荐,因为它会使代码变得复杂且难以维护。
以下是使用原生 readline
模块的一个简化示例(仍然是异步的,但展示了基本用法):
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('请输入一些内容:', (answer) => {
console.log('你输入的是: ' + answer);
rl.close();
});
总之,对于命令行交互,使用 readline-sync
库通常是最简单和最直接的方法。