javascript - 将 Node REPL 调整为在异步回调时不破坏提示?

标签 javascript node.js read-eval-print-loop

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

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

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

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

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

最佳答案

直接进入输出流,我设法让一些东西按我想要的方式工作:

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

尽管所有这些都假设输出符合 ANSI 标准的输出流,并且感觉非常 hack-ish,像那样覆盖 console.log() 函数。是否有更合规的方式来处理这个问题,或者这是最好的方式?

关于javascript - 将 Node REPL 调整为在异步回调时不破坏提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28683743/

相关文章:

node.js - 在镜像大小较小的 Docker Alpine 镜像中创建非 root 用户?

c - 有C语言的解释器吗?

javascript - 如何禁用 puppeteer 中的缓存?

javascript - 在html文件中<%标签

javascript - 如何在不重新加载页面的情况下更新 map 上从 firestore 检索的标记?

javascript - 如何在node js中管理入口文件上的请求数据

javascript - 将流传输到无处

string - 如何在字符串中添加换行符?

clojure - 如何在用户定义的命名空间中启动 REPL?

javascript - 如何更改div子元素中的所有元素id