我是进入系统的(相对)节点新手,并且社区中的所有热情“只要编写回调,一切都是异步的并且是事件驱动的,不用担心!”使我对单个程序中的控制流有些困惑(或更笼统地说,是在较大程序中处理单个请求期间的控制流)
如果我在节点下运行以下程序
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();
foo
是否有可能在bar
之后执行?当我通过命令行在本地运行程序时,总是Called Foo
Called Bar
但是我看到好主意的福音工作者发出了许多警告,包括不要假设您认为会回调您的回调,因此我不清楚他们是否只是在警告我有关库实现细节或节点的信息。当您使用函数对象作为参数时,js会做一些奇怪的/特殊的事情。
最佳答案
不,没有机会。不适用于该代码。
如果您正在编写自己的函数,或者可以访问代码,则无需假设一切都已同步或相反,但是如果您无法访问代码或没有权限,尚未阅读,那么不行,您不能假设回调将是同步的。
但是,进行这样的假设是不好的做法,原因有两个,首先是仅仅因为它现在是同步的,就不意味着其他人,或者健忘的未来您以后不能更改它,其次,因为如果它们都是同步的,为什么您/他们是否首先使用回调?回调的全部要点是允许异步调用的可能性。使用回调,然后像使它们始终保持同步一样进行操作,即使您知道这种情况,也会使您的代码对其他人造成混乱。