混淆与node.js代码有关

时间:2013-02-16 04:04:44

标签: 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)这里的j是什么,这是什么(i)

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

我完全不知道这段代码是如何工作的?

2 个答案:

答案 0 :(得分:1)

循环正在为async.parallel()准备与tasks几乎相同的函数数组。

在循环之后,如果它仅在当前迭代一次,queries将类似于:

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

并且,对于每个额外的迭代,将添加新的function (callback) { ... }

  

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

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

  在query.push中,第二个是传递函数(j)这里的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将继续更改值。

答案 1 :(得分: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);