是console.log/debug/warn/error在node.js中- 异步?我的意思是javascript代码执行将停止,直到将东西打印在屏幕上,还是将在以后打印?
console.log/debug/warn/error
另外,我有兴趣知道console.log是否有可能在语句崩溃后立即不显示任何内容。
更新: 从Node 0.6开始,此帖子已过时,因为stdout 现在是 同步的 。
好吧,让我们看看console.log实际是什么。
console.log
首先,它是控制台模块的一部分:
exports.log = function() { process.stdout.write(format.apply(this, arguments) + '\n'); };
因此,它只是进行一些格式化并写入process.stdout,到目前为止还没有异步。
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遵守其非阻塞承诺。