2013-02-16 27 views
0

我发现这个代码混淆的地方说,我可以运行一些数据库查询异步与node.js的代码

var queries = []; 


for (var i=0;i <1; i++) { 
    queries.push((function(j){ 
    return function(callback) { 
     collection.find(
    {value:"1"}, 

    function(err_positive, result_positive) { 
     result_positive.count(function(err, count){ 
     console.log("Total matches: " + count); 
     positives[j] = count;   
     callback(); 
     }); 
    } 

    ); 
    } 
    })(i)); 
} 

async.parallel(queries, function(){ 
    // do the work with the results 
} 

我没有得到这个角色什么是回调函数是如何如何界定?第二次在queries.push,它传递函数(J)什么是法官在这一点,这是什么(i)对于

queries.push((function(j){})(i)); 

我完全糊涂了如何代码工作?

回答

1

环路准备的几乎相同的功能的阵列作为tasksasync.parallel()

循环后,给它只有一次迭代目前,queries将类似于:

var queries = [ 
    function (callback) { 
     collection.find(
      // etc. 
     ); 
    } 
]; 

而且,每增加一次迭代,新function (callback) { ... }将增加。

什么是回调函数是如何定义的?

callback只是每个函数的命名参数。其值将由async.parallel()定义为另一个function,该值在被调用时允许async知道每个任务何时完成。

秒查询。推,它传递函数(J)什么是法官在这一点,这是什么(i)对于

queries.push((function(j){})(i)); 

(function(j){})(i)Immediately-Invoked Function Expression (IIFE)j作为命名的参数,它与i一个马上打电话传递的参数,并返回一个新function (callback) {}push编到queries

queries.push(
    (function (j) { 
     return function (callback) { 
      // etc. 
     }; 
    })(i) 
); 

的IIFE的目的是创建一个closure - 本地变量词法范围是“ 卡住“以及在范围内定义的任何function。这允许每个function (callback) {}具有其自己的j以及单个值i(因为i将继续改变值,因为for循环继续)。

0

回调是最酷的功能之一。回调只是另一个正常功能。实际上,您可以将函数本身作为另一个函数中的参数传递。 说功能foo()做些什么。在执行foo()之后,您可能想要执行其他操作。所以,为了达到这个目的,你需要定义一个函数bar()并将这个函数作为参数传递给函数foo()!

function foo(callback){ 
    // do something 
    callback(); 
} 

function bar(){ 
    // do something else 
} 

foo(bar()); 
//here we can see that a function itself is being passed as a param to function foo. 

了解更多了解here的正确链接。

而且

queries.push((function(j){})(i)); 
在JavaScript

,这是调用函数的另一种方式。

function(){ 
// do something. 
}(); 

您实际上并不需要定义函数名称,并且可以直接调用它,而不需要名称。你甚至可以通过params。

function(a){ 
alert(a)' 
}(10);