初学 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 ,我要怎么做才能得到正确的值呢?
1
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); ``` |
2
plqws 2016-05-11 16:49:44 +08:00 1
上面那条回复手滑发出去了,下面这样:
```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 介绍 |
3
bladeralien OP @plqws 谢谢啦,很有用。
|
4
cheng007 2016-05-11 17:07:58 +08:00
callback 思维反人类吧😄,早用协程早解脱,当然对新手来说,协程也没有那么容易理解。
|
6
jarlyyn 2016-05-11 17:56:04 +08:00
async.js
|
7
magicdawn 2016-05-11 18:46:16 +08:00
|
8
deangl 2016-05-11 20:08:59 +08:00 via Android
用 Promise 也比较清楚。
|
9
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)); |
10
magicdawn 2016-05-11 20:39:12 +08:00
哎呀~这 V2EX 回复~感觉像吃了翔一样...
|
11
sox 2016-05-11 22:00:01 +08:00
这大概是为什么 V2EX 技术讨论很少的原因了,回复里的代码看着会想死 😂
|
12
taxiangdeni 2016-05-12 00:36:19 +08:00 via iPhone
这贴应该放在 cnodejs,应该是更多人帮你解决
|