Node.js异步执行时间太长

时间:2017-06-06 12:40:59

标签: javascript node.js async.js

我有一系列查询

var array = [ 'UPDATE EVALUATION SET mark = "16" WHERE id_eval = "21" AND id_usr = "125"', 
              'UPDATE EVALUATION SET mark = "9" WHERE id_eval = "22" AND id_usr = "125"', 
              'UPDATE EVALUATION SET mark = "8" WHERE id_eval = "34" AND id_usr = "125"' 
            ]

然而,当我尝试使用异步同时执行所有操作时,我的网页显示Waiting for localhost...并且它会一直保持加载状态。我做错了什么?

async.forEach(array, function(query, callback) {
    connection.query(query, function(err, rows, fields) {
        if(err) {
            return console.error(err);
        }

        callback();
    });
}, function(err){
    if(err) {
        return console.log(err);
    }
});

2 个答案:

答案 0 :(得分:1)

请确保在调用forEach回调后返回响应:

async.forEach(array, function(query, callback) {
    connection.query(query, function(err, rows, fields) {
        if(err) {
            console.error(err);
        }

        callback();
    });
}, function(err){
    if(err) {
        console.log(err);
    }

    res.redirect('/next-page');
});

这样,重定向将仅在所有查询结束时发生。

您应该验证的一些事项:

  • 确认您未在上述代码之前致电res.end()res.redirect()或类似内容。
  • 验证您的数据库query方法实际上只需要2个参数:查询和回调,而不是介于两者之间的任何内容(例如查询参数)。
  • 验证这段代码是否在您预期时实际调用。尝试一直调试请求。
  • 目前这里没有真正的错误处理。如果出现问题,您应该考虑返回HTTP错误。这也应该有助于您将来调试此代码。

答案 1 :(得分:0)

通常你有一个像这样的请求处理程序:

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

您的浏览器在调用res.end之前保持连接!

在您的环境中,它应该看起来像

const server = http.createServer((req, res) => {

  // ... 
  async.forEach(array, function(query, callback){
    connection.query(query, function(err, rows, fields) {
        // you may do some work here but leave it *alyways* via callback!
        callback(err);
    });
  }, function(err){
    if(err){ // this may be errors from above
      return console.log(err);
    }
    // Exit here !
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('All done.\n');
  });
});

......或者说有点清洁

function doSomeDatabaseUpdates(onFinished) {
  var array = [...];
  async.forEach(array, function(query, callback){
    connection.query(query, function(err, rows, fields) {
        // you may do some work here but leave it *alyways* via callback!
        callback(err);
    });
  }, 
  function IGetCalledAfterAboveCallbackWereExecuted(err){
    if(err){ // this may be errors from above
      return console.log(err);
    }
    // Exit here !
    onFinished();
  });
}


const server = http.createServer((req, res) => {

  // ... do some work

  if (doSomeUpdated === true) {
    doSomeDatabaseUpdates(function calledAfterUpdates() {
      res.end("updates something");
    });
  } else {
    res.end("nothing to do");
  }

});