给出如下设置:
var foo = -1;
db.myCollection.findOne({_id : 1}, function(err, doc) {
foo = doc.bar; //bar == 99 is true
});
console.log(foo);
我发现控制台总是输出99。 为什么代码会等待?这不是不同步吗?
答案 0 :(得分:2)
并非所有回调都是异步的。这取决于您将回调传递给的方法的机制。
例如,数组上的sort
方法接受一个它同步调用的回调; sort
在完成对您给出的回调的所有调用之后才会返回:
var a = [2, 8, -1];
console.log("before");
a.sort(function(x, y) {
console.log("callback called with", x, y);
return x- y;
});
console.log("sort complete:", a);
输出:
before callback called with 2 8 callback called with 8 -1 callback called with 2 -1 sort complete: [-1, 2, 8]
(请注意,“使用”行调用“回调”的确切顺序和数量会因浏览器的JavaScript引擎而异。)
相比之下,NodeJS API中的fs.open
调用异步调用其回调 ;它在启动打开文件的过程后返回,但不等待该过程完成,然后在进程稍后完成时调用回调。我无法提供fs.open
的现场示例,但setTimeout
也异步调用其回调:
console.log("before");
setTimeout(function() {
console.log("in the callback");
}, 0);
console.log("after");
输出:
before after in the callback