首页 > 解决方案 > 如何避免节点中的 readline 和 console.log 重叠

问题描述

在此处输入图像描述

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();
});

... ohter 异步

let count = 0
setInterval(()=>{
    console.log(count++)
},1000)

我想在避免重叠 readline 和 console.log 的同时打字

我怎样才能做到这一点?

除了readline还有其他方法吗???谢谢!!

标签: node.jsconsolereadline

解决方案


我假设您的意思是要在向终端写入命令的同时输出到终端,而不会被破坏?

还没有完全玩弄它,但到目前为止这对我有用:

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);

基本上,我会跟踪每次击键的用户输入并将它们存储在一个字符串中,直到用户按下返回。然后我将“当前”字符串发送到我整理并处理所有可能的命令组合的地方。

我一直面临着同样的问题,我认为,输出干扰输入。只要您使用 print() (它几乎像 console.log 一样工作,除了您必须传递一个参数,它确实可以处理粉笔和其他东西)它应该可以正常工作的消息。

请注意,我禁用了顶部的箭头键,因此按下箭头不会移动光标并将其弄乱。

'current' 应该是您在终端中为应用程序编写的命令字符串,我创建了一个函数来处理所有可能的命令行函数。


推荐阅读