微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是node.js’console.log异步?

node.js中的console.log / debug / warn / error是否异步?我的意思是JavaScript代码执行停止,直到东西被打印在屏幕上,或者将打印在稍后阶段?

此外,我有兴趣知道是否可能的console.log不显示任何东西,如果语句立即崩溃的节点后。

解决方法

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

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

首先它是console module的一部分:

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

所以它只是做一些格式化和写入process.stdout,没有异步到目前为止。

process.stdout是一个getter defined on startup,它被延迟初始化,我添加了一些注释来解释一些事情:

.... 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的情况下,我们结束了here,这个东西继承了套接字。因此,所有的节点基本上是将数据推送到套接字,然后终端照顾其余的。

让我们测试一下吧!

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毫秒来将数据推送到终端。

流情况也是如此,并且文件大小也得到句柄asynchronous

所以是的Node.js适用于其非阻塞promise。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐