求助 如何在 Node.js 中实现非异步的用户输入

2016-05-11 16:41:51 +08:00
 bladeralien

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

3766 次点击
所在节点    Node.js
12 条回复
plqws
2016-05-11 16:48:57 +08:00
```javascript
var inputMove = function(callback) {
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);
})
callback(move);
rl.close();
});
rl.on('close', function() {
process.exit(0);
});
return move;
}
inputMove(function() {});
console.log(move);
```
plqws
2016-05-11 16:49:44 +08:00
上面那条回复手滑发出去了,下面这样:
```javascript
var inputMove = function(callback) {
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);
})
callback(move);
rl.close();
});
rl.on('close', function() {
process.exit(0);
});
return move;
}
inputMove(function(move) {
console.log(move);
});

```
其实还有更优雅的 async await 大法,可以去看看阮一峰的 es6 介绍
bladeralien
2016-05-11 17:06:14 +08:00
@plqws 谢谢啦,很有用。
cheng007
2016-05-11 17:07:58 +08:00
callback 思维反人类吧😄,早用协程早解脱,当然对新手来说,协程也没有那么容易理解。
extreme
2016-05-11 17:52:08 +08:00
@cheng007 说得那么厉害的样子,可惜毫无用处。
jarlyyn
2016-05-11 17:56:04 +08:00
async.js
magicdawn
2016-05-11 18:46:16 +08:00
deangl
2016-05-11 20:08:59 +08:00
用 Promise 也比较清楚。
magicdawn
2016-05-11 20:38:32 +08:00
放开我来

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));
magicdawn
2016-05-11 20:39:12 +08:00
哎呀~这 V2EX 回复~感觉像吃了翔一样...
sox
2016-05-11 22:00:01 +08:00
这大概是为什么 V2EX 技术讨论很少的原因了,回复里的代码看着会想死 😂
taxiangdeni
2016-05-12 00:36:19 +08:00
这贴应该放在 cnodejs,应该是更多人帮你解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/277947

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX