0

我发现这段代码说我可以异步运行一些数据库查询

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
}

我没有得到什么是回调函数的部分它是如何定义的?在querys.push中的第二个,它传递函数(j)什么是j,这个(i)是什么

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

我很困惑这段代码是如何工作的?

4

2 回答 2

1

tasks该循环正在准备一系列与for几乎相同的函数async.parallel()

在循环之后,鉴于它目前只迭代一次,queries将类似于:

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

而且,对于每一次额外的迭代,function (callback) { ... }都会添加一个新的。

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

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

在querys.push中的第二个,它传递函数(j)什么是j,这个(i)是什么

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

(function(j){})(i)一个立即调用函数表达式 (IIFE)j作为命名参数,它会立即使用i传递的参数调用,并返回一个function (callback) {}push编辑的新函数queries

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

IIFE 的目的是创建一个闭包——一个带有局部变量的词法范围,它“function”在范围内定义的任何s 上。这允许每个function (callback) {}都有自己j的单个值i(因为随着循环的继续i,值将继续改变)。for

于 2013-02-16T07:59:32.523 回答
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.

如需更多了解,请点击此处的正确链接。

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

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

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

您实际上不需要定义函数名称,并且可以直接调用它而无需名称。你甚至可以将参数传递给它。

function(a){
alert(a)'
}(10);
于 2013-02-16T04:22:40.363 回答