如何避免在节点中重叠 readline 和 console.log
How can I avoid overlapping readline and console.log in node
const re = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
re.on("line", (order) => {
if (!this.checkIsCorrectOrder(order)) {
console.log("Wrong");
return;
}
someFun(order)
}).on("close", () => {
process.exit();
});
... 其他异步
let count = 0
setInterval(()=>{
console.log(count++)
},1000)
我想打字的同时避免 readline 和 console.log
重叠
我该怎么做?
除了readline还有别的办法吗???谢谢!!
我假设你的意思是你想在向终端写入命令的同时输出到终端,而不被破坏?
还没有玩完,但到目前为止这对我有用:
var stdin = process.stdin;
var stdout = process.stdout;
var prompt = ">";
var current = "";
stdin.setRawMode(true);
stdin.setEncoding('utf8');
stdout.write(prompt);
stdin.on( 'data', function( key ){
switch (key){
case '\u001B\u005B\u0041'://up
case '\u001B\u005B\u0043'://right
case '\u001B\u005B\u0042'://down
case '\u001B\u005B\u0044'://left
break;
case '\u0003':
process.exit();
break;
case '\u000d':
//RunCommands(current)
current = "";
console.log("\b");
stdout.write(prompt);
break;
case '\u007f':
stdout.write("\r\x1b[K") ;
current = current.slice(0, -1);
stdout.write(prompt + current);
break;
default:
stdout.write(key);
current += key;
break;
}
});
function print(str){
let totalCurrentLength = current.length + prompt.length;
let lines = Math.ceil(totalCurrentLength / stdout.columns);
for(i = 0; i < lines; i++){
stdout.clearLine();
stdout.write('\u001B\u005B\u0041');
}
stdout.write('\u001B\u005B\u0042');
stdout.cursorTo(0)
console.log(str);
stdout.write(prompt + current);
}
var count = 0;
setInterval(() => {
print("Test interference: " + count++)
}, 500);
基本上,我会跟踪每次击键的用户输入并将它们存储在一个字符串中,直到用户按下 return。然后我将“当前”字符串发送到我整理和处理所有可能的命令组合的地方
我认为我遇到过与您相同的问题,即输出干扰输入。只要你使用 print()(它几乎像 console.log 一样工作,除了你必须传递一个参数,它确实处理粉笔和东西)它应该工作正常的消息。
请注意,我禁用了顶部的箭头键,因此按下箭头键不会四处移动光标并把它弄得一团糟。
'current'应该是你在终端中为应用程序编写的命令字符串,我做了一个函数来处理所有可能的命令行功能。
const re = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
re.on("line", (order) => {
if (!this.checkIsCorrectOrder(order)) {
console.log("Wrong");
return;
}
someFun(order)
}).on("close", () => {
process.exit();
});
... 其他异步
let count = 0
setInterval(()=>{
console.log(count++)
},1000)
我想打字的同时避免 readline 和 console.log
重叠我该怎么做?
除了readline还有别的办法吗???谢谢!!
我假设你的意思是你想在向终端写入命令的同时输出到终端,而不被破坏?
还没有玩完,但到目前为止这对我有用:
var stdin = process.stdin;
var stdout = process.stdout;
var prompt = ">";
var current = "";
stdin.setRawMode(true);
stdin.setEncoding('utf8');
stdout.write(prompt);
stdin.on( 'data', function( key ){
switch (key){
case '\u001B\u005B\u0041'://up
case '\u001B\u005B\u0043'://right
case '\u001B\u005B\u0042'://down
case '\u001B\u005B\u0044'://left
break;
case '\u0003':
process.exit();
break;
case '\u000d':
//RunCommands(current)
current = "";
console.log("\b");
stdout.write(prompt);
break;
case '\u007f':
stdout.write("\r\x1b[K") ;
current = current.slice(0, -1);
stdout.write(prompt + current);
break;
default:
stdout.write(key);
current += key;
break;
}
});
function print(str){
let totalCurrentLength = current.length + prompt.length;
let lines = Math.ceil(totalCurrentLength / stdout.columns);
for(i = 0; i < lines; i++){
stdout.clearLine();
stdout.write('\u001B\u005B\u0041');
}
stdout.write('\u001B\u005B\u0042');
stdout.cursorTo(0)
console.log(str);
stdout.write(prompt + current);
}
var count = 0;
setInterval(() => {
print("Test interference: " + count++)
}, 500);
基本上,我会跟踪每次击键的用户输入并将它们存储在一个字符串中,直到用户按下 return。然后我将“当前”字符串发送到我整理和处理所有可能的命令组合的地方
我认为我遇到过与您相同的问题,即输出干扰输入。只要你使用 print()(它几乎像 console.log 一样工作,除了你必须传递一个参数,它确实处理粉笔和东西)它应该工作正常的消息。
请注意,我禁用了顶部的箭头键,因此按下箭头键不会四处移动光标并把它弄得一团糟。
'current'应该是你在终端中为应用程序编写的命令字符串,我做了一个函数来处理所有可能的命令行功能。