node.js从控制台中获取数据
成品代码
//该方法需要返回一个Promise对象
function consoleScanner(){
return new Promise((resolve,reject)=>{
//打开流
process.stdin.resume();
//监听输入事件
process.stdin.on('data',chunk=>{
//得到数据
resolve(chunk);
})
})
}
//由于await只能在被async修饰函数中执行所以可以将之前得代码用函数进行包裹
async function main(){
console.log('请输入您的名字');
var username = await consoleScanner();
console.log('您的名字是:'+username);
}
//执行
main();
效果如下:
涉及知识
实现上面的代码主要涉及了3个知识
- process
- Promise
- async和await
process
process是一个全局变量,不需要require就可以直接使用,它里面包含众多的系统进程信息,包括进程号,node版本,目录等等。
在这里主要提及两个属性
- process.stdout 标准输出流
process.stdout.write('Hello') //效果:从控制台上输出Hello
通过process.stdout.write方法可以实现和console.log()相同的效果
实际上,console.log的底层就是由process封装而成
2. process.stdin 标准输入流
//默认情况下流是关闭的,需要监听处理输入流数据,首先要开启输入流
process.stdin.resume();
//监听用户输入的数据,当用户输入数据时就会触发
process.stdin.on('data',chunk=>{
console.log('您输入了:'+chunk);
})
结果:
仅仅是这些代码,并不能让我们随心所欲的在代码的任意地方去获取用户输入的值
因为这其间存在着一个异步的问题
要获取控制台的值就必须对用户的输入进行等待
而Promise+async+await的结合就能很好的做到这一点
知识点小复习
如果await修饰了Promise对象,则需要等待Promise获取到结果之后代码才会据需执行
await只能在被async修饰的函数中使用
首先我们可以将出入事件监听包装成一个Promise函数
function consoleScanner(){
return new Promise((resolve,reject)=>{
//打开流
process.stdin.resume();
//监听输入事件
process.stdin.on('data',chunk=>{
//得到数据
resolve(chunk);
})
})
}
接着写一个入口函数用async修饰
//由于await只能在被async修饰函数中执行所以可以将之前得代码用函数进行包裹
async function main(){
console.log('请输入您的名字');
var username = await consoleScanner();
console.log('您的名字是:'+username);
}
mian();
这样就达到了我们想要的效果