callback()节点Js

我对这个程序很困惑。 我通过Brad Dayley购买了一本名为“Node JS,MongoDB和AngularJS Web Development”的书。 我find了一个程序来演示一个叫做闭包的东西,这个程序就是一个例子。 这只是该计划的第一部分。

function logCar(logMsg, callback){ process.nextTick(function(){ callback(logMsg); }); } var cars = ["Ferrari", "Porsche", "Bugatti"]; for(var idx in cars){ var message = "Saw a " + cars[idx]; logCar(message, function(){ console.log("Normal Callback: " + message); }) } 

我一直在试图弄清楚这个程序如何运行整整一个小时,但我不知道什么是callback(logMsg)的function。

我知道这可能是一个非常基本的问题,但是我无法把它包围起来。

callback是你传递给logCar()的任何函数。 当logCar完成它应该做的任何事情时,它将调用callback函数。 在你的for循环中,你可以像这样调用logCar()。

 logCar(message, function(){ console.log("Normal Callback: " + message); }) 

在这里,function(){..}是callback函数,一旦logCar执行完毕,它就会被调用。 在这种情况下,您提供的callback函数将console.log作为第一个parameter passing给您的消息。 你可能已经通过另外一个函数来执行不同的callback了。

我发现通过更紧密地跟踪执行path,尤其是logMsg所采用的path,可以更容易地将自己的头部包裹起来。 一个好的debugging器对此很好。

除非定义了一个名为message的variables,否则没有什么真正的事情发生。 一开始就是“看法拉利”。

“消息”旁边还有一个匿名function,不幸的是很难分离出来并进行定义。 因为它看起来超出了它的作用域内的一个名为“message”的variables,它被困在那个for循环中,所以我们不能在第6行做:

 var someFunction = function(){ console.log("Normal Callback: " + message); } 

…因为什么是“信息”? 除了for循环以外,没有任何东西可以直接访问“message”(除了closures,但是不用担心)。 请注意,此function将不会执行。 这是刚刚创build的这一点。

接下来执行LogCar("Saw a Ferrari", someFunction...) 。 LogCar在哪里? 哦,顶部。 让我们跳到那里,但为了简单起见,我们跳过process.nextTick。 基本上someFunction("Saw a Ferrari")发生在这里。 SomeFunction在哪里? 哦,那就是那个尚未执行的匿名函数。 现在它的执行时间已经到来。 所以这个过程跳回到那里看看里面是什么,执行它,这是console.log("Saw a Ferrari");

这样做了,这个过程重复“看到保时捷”。