是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