node 中有console.log/debug/warn/error
个 node .js asynchrounous?我的意思是,javascript代码的执行会在屏幕上打印出来之前停止,还是会在稍后的阶段打印出来?
另外,我想知道是否有可能安装控制台.如果语句在 node 崩溃后立即显示,则登录以不显示任何内容.
node 中有console.log/debug/warn/error
个 node .js asynchrounous?我的意思是,javascript代码的执行会在屏幕上打印出来之前停止,还是会在稍后的阶段打印出来?
另外,我想知道是否有可能安装控制台.如果语句在 node 崩溃后立即显示,则登录以不显示任何内容.
Update:从 node 0.6开始这篇文章已经过时了,因为stdout现在是synchronous.
让我们看看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,这个东西继承自socket.基本上,所有的数据都由插座来处理.
Let's test it!
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);
Result
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
终端需要大约1秒钟打印出套接字内容,而 node 只需要17毫秒就可以将数据推送到终端.
流的情况也是如此,文件的情况得到句柄asynchronous.
所以yes个 node .js信守其非封锁promise .