在node.js中为回调外部的变量赋值时会发生什么?

时间:2016-11-01 16:50:11

标签: javascript node.js callback

给出如下设置:

var foo = -1;

db.myCollection.findOne({_id : 1}, function(err, doc) {
    foo = doc.bar; //bar == 99 is true

});

console.log(foo);

我发现控制台总是输出99。 为什么代码会等待?这不是不同步吗?

1 个答案:

答案 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