所有节点"回调"函数是否可能是异步的?

Ala*_*orm 1 javascript callback node.js

我是一个(相对)节点新手进入系统,社区中所有的热情"只是写回调,一切都是异步和事件驱动的,不用担心!" 让我对单个程序中的控制流程感到有些困惑(或者更多的节点术语,在更大的程序中处理单个请求期间的控制流程)

如果我在节点下运行以下程序

var foo = function(){
    console.log("Called Foo");
};

var bar = function(){
    console.log("Called Bar");
};

var doTheThing = function(arg1, callback){
    callback();
};

doTheThing(true, function() {
    foo();
});
bar();
Run Code Online (Sandbox Code Playgroud)

没有机会在之后foo执行?当我在本地通过命令行运行程序时,它始终是 bar

Called Foo
Called Bar
Run Code Online (Sandbox Code Playgroud)

但是我看到很多来自好心的福音传道者的警告,不要以为你认为你的回调会被调用,我不清楚他们是不是只是警告我关于库实现的细节,或者是节点.当您使用函数对象作为参数时,js会做一些奇怪/特殊的事情.

小智 5

不,没有机会.不是那个代码.

如果您正在编写自己的函数,或者您可以访问代码,则无需假设,您知道所有内容是同步还是其他,但如果您无法访问代码,或者没有读它,然后不,你不能假设回调将是同步的.

然而,出于两个原因做出这样的假设是不好的做法,首先是因为它现在同步并不意味着其他人,或者健忘的未来你以后不能改变它,其次,因为如果它是全部同步的,为什么是你/他们首先使用回调?回调的整个要点是允许异步调用的可能性.使用回调,然后表现得像是他们总是同步,即使你知道这种情况,也会让你的代码混淆任何其他人进来.