目录
inquirer命令行交互原理?(一)readline的实现办法和原理
inquirer命令行交互原理?(二)手写readline实现
背景
上篇曾经具体的形容了readline源码的实现,当初就是来测验下学习的状况,手动来实现一个readline
代码
(1)先监听输出流
function stepRead(callback) { function onkeypress(s) { output.write(s); } const input = process.stdin; const output = process.stdout; let line = ''; emikeypressEvents(input); input.on('keypress', onkeypress);};function emikeypressEvents(stream) { function onData(chunk){ g.next(chunk.toString()) } const g = emitkeys(stream); g.next() stream.on('data',onData)};function *emitkeys(stream) { while(true){ let ch = yield; stream.emit('keyPress',ch); }}stepRead();
(2)一一字母监听输出流,并返回后果
知识点:input.setRawMode(true);
input.resume();
// 从新开始,重启
function stepRead(callback) { function onkeypress(s) { output.write(s); line += s; switch (s) { case '\r': input.pause(); callback(line) break; } } const input = process.stdin; const output = process.stdout; let line = ''; emitKeypressEvents(input); input.on('keypress', onkeypress); input.setRawMode(true); input.resume();};function emitKeypressEvents(stream) { function onData(chunk){ g.next(chunk.toString()) } const g = emitkeys(stream); g.next() stream.on('data',onData)};function* emitkeys(stream) { while(true){ let ch = yield; stream.emit('keypress',ch); }}stepRead(function(s){ console.log(s); console.log('answer=', s);});
解说
(1)先将输出流和输入流进行缓存,将输出流要填写的信息放在line变量中;
const input = process.stdin; const output = process.stdout; let line = '';
(2)调用emitKeypressEvents(input),执行emitkyes的Generator函数。.next()
;stream.on('data',onData)
绑定输出流
function emitKeypressEvents(stream) { function onData(chunk){ g.next(chunk.toString()) } const g = emitkeys(stream); g.next() stream.on('data',onData) };
function* emitkeys(stream) { while(true){ let ch = yield; stream.emit('keypress',ch); }}
(3)input.on('keypress', onkeypress);
绑定了onkeypress事件;输入流写入信息;如果是回车('\r')的话,shitch 来进行判断。
function onkeypress(s) { output.write(s); // 输出的信息进行打印 line += s; switch (s) { case '\r': input.pause(); callback(line) break; } }