Callback()节点Js

时间:2015-06-20 03:41:18

标签: javascript angularjs node.js mongodb

我对这个节目感到很困惑。我在Brad Dayley那里买了一本名为“Node JS,MongoDB和AngularJS Web开发”的书。我找到了一个程序来演示一个叫做闭包的东西,并以此程序为例。这只是该计划的第一部分。

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);
    })
}

我一直试图弄清楚这个程序如何运作整整一个小时,但我无法弄清楚回调的功能(logMsg)。

我知道这可能是一个非常基本的问题,但我无法绕过它。

2 个答案:

答案 0 :(得分:2)

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

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

这里,function(){..}是回调函数,一旦logCar执行完就会调用它。在这种情况下,您提供的回调函数将console.log您传递的消息作为第一个参数。你可以通过另一个函数来执行不同的回调函数。

答案 1 :(得分:2)

我发现通过更紧密地遵循执行路径,尤其是logMsg采用的路径,我们更容易解决这些问题。一个好的调试器对此非常有用。

在for循环之前没有任何事情发生,其中定义了一个名为message的变量。一开始它将是“看见法拉利”。

“消息”旁边还有一个匿名函数,遗憾的是难以分离和定义。因为它看起来超出了它的范围,因为一个名为“message”的变量被困在for循环中,我们无法在第6行进行:

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

...因为什么是“消息”?除了for循环外,没有任何东西可以直接访问“消息”(除了封闭,但不要担心)。请注意,此功能尚未执行。它刚刚被创建了。

接下来执行LogCar("Saw a Ferrari", someFunction...)。 LogCar在哪里?哦,顶部。让我们跳到那里,但为了简单起见,我们跳过process.nextTick。基本上someFunction("Saw a Ferrari")发生在这里。 SomeFunction在哪里?哦,这就是那个尚未执行的匿名函数。现在它的执行时间到了。因此,该过程会跳回那里以查看其中的内容并执行它,即console.log("Saw a Ferrari");

已经完成了,并且“Saw a Porsche”重复了这个过程。