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 ,我要怎么做才能得到正确的值呢?


13 回复

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 库通常是最简单和最直接的方法。

回到顶部