0

いくつかのdbクエリを非同期で実行できると書かれているこのコードを見つけました

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
}

コールバック関数とはどのように定義されているのかという部分を取得できませんでした。query.push の 2 番目に、function(j) を渡しています。これの j と、これ (i) の意味

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

このコードがどのように機能しているのか完全に混乱していますか?

4

2 に答える 2

1

ループは、とほぼ同じ関数の配列を準備していtasksますasync.parallel()

ループの後、現在1回だけ繰り返されるとすると、次のqueriesようになります。

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

そして、追加の反復ごとに、新しいfunction (callback) { ... }ものが追加されます。

コールバック関数とはどのように定義されていますか?

callback各関数の名前付き引数です。その値は、呼び出されたときに各タスクがいつ完了したかを知ることができるasync.parallel()別の値として定義されます。functionasync

querys.pushの2番目に、関数(j)を渡します。これはjであり、this(i)は何ですか。

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

これ(function(j){})(i)は、名前付き引数として即時呼び出し関数式(IIFE)であり、渡された引数を使用してすぐに呼び出され、新しい引数を返します。jifunction (callback) {}pushqueries

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

IIFEの目的は、クロージャを作成することです。これは、スコープ内でも定義されている任意のsに「スタック」しているローカル変数を持つ字句スコープです。functionこれにより、それぞれが単一の値をfunction (callback) {}持つ独自の値を持つことができます(ループが続くにつれて値が変化し続けるため)。jiifor

于 2013-02-16T07:59:32.523 に答える
0

コールバックは最も優れた機能の 1 つです。コールバックは単なる別の通常の関数です。実際には、関数自体を別の関数のパラメーターとして渡すことができます。関数 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 に答える