调整节点REPL不要在asynchronouscallback上触发提示?

在使用Node REPL控制台时,我正在寻找一种asynchronous调用的方法,既不会locking控制台input,也不会在控制台提示符返回时重新启动。

我已经看到在REPL中处理asynchronous调用的一些解决scheme,在这里编写自己的自定义eval函数,您可以检查执行的代码的结果,以查看它是否为promise / async对象,只是在parsing后才返回。

不过,我想解决重复后台进程logging进度的问题。 理想情况下,我希望它的行为像Chrome Javascript控制台,如果您在控制台提示符下部分打印了命令,并且logging了asynchronous结果,那么您input的行将被移动一行,日志插在它上面。

所以,在function上,我想插入的逻辑,当调用console.log()被调用时,包含游标的行首先被清除,然后log()的内容写入,然后REPL提示符用户input到目前为止)被重新写入新的输出后面的行。

有没有办法钩入REPL对象来完成这个? 这是从REPL的输出stream的一些高级操纵(即只有在terminal上支持“擦除到行首”转义码)?

直接进入输出stream我设法得到像我想要的东西:

 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兼容的输出stream是输出,并感觉非常黑客,重写console.log()函数。 有没有一个更合适的方式来处理这个,或者这是最好的方法?