【问题标题】:Nodejs wait for a for loop to finish with mysql queryNodejs等待一个for循环完成mysql查询
【发布时间】:2016-03-23 21:43:42
【问题描述】:

我有一个 sql 查询,我使用 node-mysql 库在 nodejs 中执行。

我想对查询结果运行一个 for 循环,如下所示:

sql.query(query, function(err, rows, field){
if (err) throw err;
for(var i = 0; i < rows.length; i++) {
    do_something_complicated();
}
}

我尝试使用异步库并将 sql.query() 放在第一个函数中,将我的其余代码放在第二个函数中,但它等待查询完成而不是 for 循环。

谁能帮忙?

【问题讨论】:

    标签: mysql node.js asynchronous synchronous


    【解决方案1】:

    尝试使用异步库及其each 函数。

    sql.query(query, function(err, rows, field) {
        if (err) throw err;
        async.each(rows, function(row, callback) {
            do_something_complicated();
            // once finished call the callback
            // no arguments or null if successful, else with the error
            callback();
        }, function(err) {
            // handle errors and do something after each row has been iterated
        }
    }
    

    如果您需要键/索引,请改用forEachOf

    【讨论】:

      【解决方案2】:

      实际上,您的代码看起来不错,直接在 for 循环之后的所有内容都应该在查询和循环都完成之后执行。完成语句之后的所有内容都会立即执行,因为 sql.query 函数是异步的。试试下面的异步实现,它应该可以正常工作:

      async.waterfall([
          async.apply(sql.query, query),
          function(rows, field, callback){
              for(var i = 0; i < rows.length; i++) {
                  do_something_complicated();
              }
      
              callback(null); // This is important, call callback after you are done with everything and pass null for the error parameter
          }
      ],
      function(err){
          if(err) throw err;
      
          // Everything is executed by now
      }
      

      【讨论】:

        猜你喜欢
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        相关资源
        最近更新 更多