将 Node REPL 调整为在异步回调中不显示 clobber 提示?

Mid*_*ing 6 javascript node.js read-eval-print-loop

在使用 Node REPL控制台时,我正在寻找一种异步调用的方法,既不锁定控制台输入,又不破坏控制台提示。

我在 REPL 中看到了一些处理异步调用的解决方案,在那里编写自己的自定义eval函数,您可以检查执行代码的结果,看看它是否是一个 promise/async 对象,并且在它解决之前不会返回。

但是,我想解决记录其进度的重复后台进程的问题。理想情况下,我希望它的行为类似于 Chrome Javascript 控制台,如果您在控制台提示符上部分打印了一个命令,并且记录了异步结果,则您正在输入的行将向下移动一行,并且日志插在它上面。

所以,在功能上,我想插入这样的逻辑,当console.log()被调用时,首先清除包含光标的行,然后是log()写入的内容,然后是 REPL 提示(以及到目前为止用户在上面输入的任何内容)在新输出之后的行上被重写。

有什么方法可以挂钩 REPL 对象来完成此操作吗?这是对 REPL 输出流的一些高级操作吗(即,仅在支持“擦除到行首”转义码的终端上才有可能)?

Mid*_*ing 1

直接进入输出流,我设法让一些东西像我想要的那样工作:

var server = repl.start({
    prompt: '> '
});
server.context.console.log = function(msg) {
    var rli = server.rli;
    server.outputStream.write('\033[2K\033[1G'); // Erase to beginning of line, and reposition cursor at beginning of line
    server.outputStream.write(msg+"\n");
    server.outputStream.write(''+rli._prompt+rli.line); // Redraw existing line
    server.outputStream.write('\033['+(rli.cursor+rli._promptLength+1)+'G'); // Move the cursor to where it was
}

server.context.doTimeout = function() {
    setTimeout(function() {
        server.context.console.log('Timeout done!');
    }, 2000);
};
Run Code Online (Sandbox Code Playgroud)

尽管所有这些都假设输出是符合 ANSI 标准的输出流,但感觉相当 hack 式,console.log()像这样重写函数。是否有更合规的方法来处理这个问题,或者这是最好的方法?