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

What happens when when assigning values to a variable outside a callback in node.js?

本文关键字:赋值 什么 变量 js node 回调 当在      更新时间:2023-09-26

给定如下设置:

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

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

不是所有的回调都是异步的。这取决于你要传递回调给的方法的机制。

例如,数组上的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);

输出:<>之前之前回调呼叫28用8 -1调用回调用2 -1调用回调排序完成:[- 1,2,8]之前

(注意"callback called with"的确切顺序和行数取决于浏览器的JavaScript引擎)

相反,NodeJS API中的fs.open调用异步调用其回调;它在启动打开文件的进程后返回,但不等待该进程完成,然后在该进程稍后完成时调用回调。我不能提供fs.open的现场示例,但是setTimeout也异步调用它的回调:

console.log("before");
setTimeout(function() {
  console.log("in the callback");
}, 0);
console.log("after");

输出:<>之前之前后在回调中