美文网首页
Node.js 环境下的 console.log 是同步执行的

Node.js 环境下的 console.log 是同步执行的

作者: _扫地僧_ | 来源:发表于2021-12-01 07:56 被阅读0次

    参考这个官网

    通常,从您的应用程序进行日志记录有两个原因:用于调试和记录应用程序活动(本质上是其他所有内容)。使用 console.log() 或 console.error() 将日志消息打印到终端是开发中的常见做法。 但是当目标是终端或文件时,这些函数是同步的,因此它们不适合生产,除非您将输出通过管道传输到另一个程序。

    https://nodejs.org/api/console.html#console_console_1

    控制台模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台机制。

    该模块导出两个特定组件:

    一个 Console 类,带有可用于写入任何 Node.js 流的 console.log()、console.error() 和 console.warn() 等方法。
    配置为写入 process.stdout 和 process.stderr 的全局控制台实例。无需调用 require('console') 即可使用全局控制台。
    警告:全局控制台对象的方法既不像它们相似的浏览器 API 那样始终同步,也不像所有其他 Node.js 流那样始终异步。有关更多信息,请参阅有关进程 I/O 的说明。

    使用全局控制台的示例:

    console.log('hello world');
    // Prints: hello world, to stdout
    console.log('hello %s', 'world');
    // Prints: hello world, to stdout
    console.error(new Error('Whoops, something bad happened'));
    // Prints error message and stack trace to stderr:
    //   Error: Whoops, something bad happened
    //     at [eval]:5:15
    //     at Script.runInThisContext (node:vm:132:18)
    //     at Object.runInThisContext (node:vm:309:38)
    //     at node:internal/process/execution:77:19
    //     at [eval]-wrapper:6:22
    //     at evalScript (node:internal/process/execution:76:60)
    //     at node:internal/main/eval_string:23:3
    
    const name = 'Will Robinson';
    console.warn(`Danger ${name}! Danger!`);
    // Prints: Danger Will Robinson! Danger!, to stderr
    

    使用 Console class 的例子:

    const out = getStreamSomehow();
    const err = getStreamSomehow();
    const myConsole = new console.Console(out, err);
    
    myConsole.log('hello world');
    // Prints: hello world, to out
    myConsole.log('hello %s', 'world');
    // Prints: hello world, to out
    myConsole.error(new Error('Whoops, something bad happened'));
    // Prints: [Error: Whoops, something bad happened], to err
    
    const name = 'Will Robinson';
    myConsole.warn(`Danger ${name}! Danger!`);
    // Prints: Danger Will Robinson! Danger!, to err
    

    process.stdout 和 process.stderr 在下列方面与其他 Node.js 流不同:

    • 它们分别由 console.log() 和 console.error() 在内部使用。
    • 写入可能是同步的,具体取决于流所连接的内容以及系统是 Windows 还是 POSIX:
    • 文件:在 Windows 和 POSIX 上同步
    • TTY(终端):在 Windows 上异步,在 POSIX 上同步
    • 管道(和套接字):在 Windows 上同步,在 POSIX 上异步

    这些行为部分是出于历史原因,因为更改它们会导致向后不兼容,但某些用户也期望它们。

    同步写入避免了诸如使用 console.log() 或 console.error() 写入的输出意外交错的问题,或者如果在异步写入完成之前调用 process.exit() 则根本不写入。有关更多信息,请参阅 process.exit()。

    警告:同步写入会阻塞事件循环,直到写入完成。在输出到文件的情况下,这几乎是瞬时的,但在高系统负载下,接收端没有读取管道,或者终端或文件系统缓慢,事件循环可能经常被阻塞并且时间长到足以对性能产生严重的负面影响。这在写入交互式终端会话时可能不是问题,但在对流程输出流进行生产日志记录时要特别小心。

    要检查流是否连接到 TTY 上下文,请检查 isTTY 属性。

    例如:

    $ node -p "Boolean(process.stdin.isTTY)"
    true
    $ echo "foo" | node -p "Boolean(process.stdin.isTTY)"
    false
    $ node -p "Boolean(process.stdout.isTTY)"
    true
    $ node -p "Boolean(process.stdout.isTTY)" | cat
    false
    

    https://nodejs.org/api/process.html#processstdout

    相关文章

      网友评论

          本文标题:Node.js 环境下的 console.log 是同步执行的

          本文链接:https://www.haomeiwen.com/subject/blmialtx.html