初学 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 ![]() 上面那条回复手滑发出去了,下面这样: ```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,应该是更多人帮你解决 |