当前位置: 首页 > 面试题库 >

node.js的console.log是异步的吗?

甘祺
2023-03-14
问题内容

console.log/debug/warn/error在node.js中-
异步?我的意思是javascript代码执行将停止,直到将东西打印在屏幕上,还是将在以后打印?

另外,我有兴趣知道console.log是否有可能在语句崩溃后立即不显示任何内容。


问题答案:

更新: 从Node 0.6开始,此帖子已过时,因为stdout 现在是 同步的

好吧,让我们看看console.log实际是什么。

首先,它是控制台模块的一部分:

exports.log = function() {
  process.stdout.write(format.apply(this, arguments) + '\n');
};

因此,它只是进行一些格式化并写入process.stdout,到目前为止还没有异步。

process.stdout是在启动时定义的吸气剂,它是惰性初始化的,我添加了一些注释来解释事情:

.... code here...
process.__defineGetter__('stdout', function() {
  if (stdout) return stdout;                            // only initialize it once

  /// many requires here ...

  if (binding.isatty(fd)) {                             // a terminal? great!
    stdout = new tty.WriteStream(fd);
  } else if (binding.isStdoutBlocking()) {              // a file?
    stdout = new fs.WriteStream(null, {fd: fd});
  } else {
    stdout = new net.Stream(fd);                        // a stream? 
                                                        // For example: node foo.js > out.txt
    stdout.readable = false;
  }

  return stdout;
});

在使用TTY和UNIX的情况下,我们到这里结束,这件事是从套接字继承的。因此,节点基本上要做的就是将数据推送到套接字上,然后由终端负责其余的工作。

让我们测试一下!

var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
    data += data; // warning! gets very large, very quick
}

var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);

结果

....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms

real    0m0.969s
user    0m0.068s
sys  0m0.012s

终端需要大约1秒钟才能打印出套接字内容,而节点仅需要17毫秒即可将数据推送到终端。

流情况也是如此,文件情况也将异步处理。

因此, 是的, Node.js遵守其非阻塞承诺。



 类似资料:
  • 我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,

  • 问题内容: 我能指望每次调用doSomething()时完成的nodeID映射吗? 我以为node.js中的所有回调都是异步的?我确实读过一篇关于通用编程的文章,说回调可以是同步的,但是我不确定node.js吗? 问题答案: JavaScript也是一种功能编程语言。您在这里拥有的是“高阶函数”,该函数将函数作为参数。高阶函数是同步的(但请参见下面的注释)。 资料来源: 功能编程 JavaScri

  • 问题内容: 在我的应用程序(node / express / redis)中,我使用一些代码同时更新数据库中的多个项目: 我可以确定在方法返回之前将执行所有这些操作吗?我关心的是异步处理。由于我不在db操作中使用回调函数,因此可以吗? 问题答案: 使用MULTI / EXEC命令创建命令队列并连续执行它们。然后使用回调发送回连贯的响应(成功/失败)。请注意,您必须使用Redis的AOF来避免这种情

  • 问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:

  • 问题内容: 有大量的库可帮助修复回调综合症的层次。 实际上,太多了,我该使用哪一个? 问题答案: 我使用Async.js。 异步是一个实用程序模块,它提供直接,强大的功能来使用异步JavaScript。尽管最初设计用于node.js,但也可以直接在浏览器中使用。 例子

  • 问题内容: 我还有另一个问题(最后一个问题。目前,我正在开发一个Node.js项目,在这个项目中,我有许多 console.log()函数。到目前为止,这还行得通,但我也希望将写入控制台的所有内容 _也_写入日志文件中。有人可以帮帮我吗? 例如: 在我的真实代码中,它的含义还多一些,但这应该可以给您一个想法。 希望能谢谢你 问题答案: 我会使用一个库而不是重新发明轮子。我在npm上寻找了一个- t