6

データベースからデータを取得するためにNodejsでサーバーを構築しています。私はしばらく非同期ライブラリを使用してきましたが、並列関数内にウォーターフォールを配置するなどのいくつかのことを理解しました。

最初にクエリを実行し、そのクエリの結果を同時に実行できる他のクエリで使用する必要があるという問題に遭遇しました。コードは次のようになります。

async.waterfall([
    function(callback) {
        connection.query(   query,
                            function(err, rows, fields) {
                                if (!err) {
                                    callback(null,rows);
                                } else {
                                    callback(null,"SORRY");
                                }
                            }
        );
    },
    async.parallel([
        function(resultFromWaterfall,callback) {
            connection.query(query,
                            function(err, rows, fields) {
                                if (!err) {
                                    callback(null,rows);
                                } else {
                                    callback(null,"SORRY");
                                }
                            }
           );
        },
        function(resultFromWaterfall,callback) {
            connection.query(query,
                            function(err, rows, fields) {
                                if (!err) {
                                    callback(null,rows);
                                } else {
                                    callback(null,"SORRY");
                                }
                            }
           );
        }
    ])
], finalCallback
);

今私の問題は、ウォーターフォール関数からの結果にアクセスし、それを並列関数で使用することです。

4

3 に答える 3

5
async.waterfall([
    function(callback) {
        connection.query(query,
            function(err, rows, fields) {
                if (!err) {
                    callback(null, rows);
                } else {
                    callback(null, "SORRY");
                }
            }
        );
    },
    function(prevData,callback){
      console.log(prevData);//Use it whereever you want.
      async.parallel([
          function(callbackOfAsyncParallel) {
              connection.query(query1,
                  function(err, rows1, fields1) {
                      if (!err) {
                          callbackOfAsyncParallel(null, rows1);
                      } else {
                          callbackOfAsyncParallel(null, "SORRY1");
                      }
                  }
              );
          },
          function(callback) {
              connection.query(query2,
                  function(err, rows2, fields2) {
                    if (!err) {
                        callbackOfAsyncParallel(null, rows2);
                    } else {
                        callbackOfAsyncParallel(null, "SORRY2");
                    }
                  }
              );
          }
      ],function mainCBOfParallel(err,reuslts){
        if(!err){
          //this will be done after tasks in async.parallel are finished.
          callback(null,results);
          //results[0]===>rows1
          //results[1]===>rows2
        }
      });
    }
], finalCallback);

コードに 2 つの間違いがあります。

  1. tasks は実行する関数である必要があります。
  2. async.parallel のタスク関数にはコールバックのみがあります。

アップデート

callbackOfAsyncParallelのタスクasync.parallelが終了したときに呼び出されるコールバック ( ) があります。

callbackのコールバック ( ) を呼び出すべきではありませんasync.waterfall。実行すると、おそらくエラーまたは予期しない結果が生じる可能性があります。

于 2016-08-31T09:33:40.070 に答える
1

これを試して..

    async.waterfall([

  function(callback) {
    connection.query(query,
      function(err, rows, fields) {
        if (!err) {
          callback(null, rows);
        } else {
          callback(null, "SORRY");
        }
      }
    );
  },
  function(resultFromWaterfall, callback) {
    async.parallel([

      function() {
        connection.query(query,
          function(err, rows, fields) {
            if (!err) {
              callback(null, rows);
            } else {
              callback(null, "SORRY");
            }
          }
        );
      },
      function() {
        connection.query(query,
          function(err, rows, fields) {
            if (!err) {
              callback(null, rows);
            } else {
              callback(null, "SORRY");
            }
          }
        );
      }
    ]);
  }

], finalCallback);
于 2016-08-31T09:04:55.127 に答える