代码之家  ›  专栏  ›  技术社区  ›  hytromo

更新不只是最后一行输出

  •  0
  • hytromo  · 技术社区  · 6 年前

    我知道如何更新最后一行输出( answered here )。

    但我注意到,有些程序更新的不仅仅是最后一行。

    以下是纱线产量的示例: yarn output

    所有的 waiting... 线的开头有一个“旋转点”,没有一个在最后一行。

    如何才能做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Devansh J    6 年前

    您可以使用 ANSI Escape sequences 要移动光标。。。

    示例:打印 "\033[3A" 将使光标向上移动三行

    如果我知道你想要什么。。。这将有助于:

    var writeEscape = a => process.stdout.write("\033[" + a);
    var moveUp = n => writeEscape(n +"A")
    var moveDown = n => writeEscape(n + "B")
    var moveRight = n => writeEscape(n +"C")
    var moveLeft = n => writeEscape(n + "D")
    var waitFor = n => new Promise(r => setTimeout(r,n))
    
    writeEscape("25l"); // hide cursor use writeEscape("","25h") to show it again
    process.stdout.write("waiting\n")
    process.stdout.write("some other text");
    moveUp(1)
    moveLeft(15) // "some other text".length = 15
    
    var printWaiting = async() => {
        writeEscape("K"); // erase the whole line
    
        process.stdout.write("waiting")
    
        await waitFor(1000)
        process.stdout.write(".")
    
        await waitFor(1000)
        process.stdout.write(".")
    
        await waitFor(1000)
        process.stdout.write(".")
    
        moveLeft(10) // "waiting".length = 7, "...".length = 3
    
        await waitFor(1000)
        printWaiting()
    }
    printWaiting();
    

    我使用了异步/等待函数。。。但setTimeout only也会起作用。。。