0

这是我在这里的第一篇文章,我希望我做得对。我正在为我想做的项目学习 nodejs,并且我正在使用 node 来编写 Web 服务。我遵循了一个教程并获得了一个有效的网络服务,但我必须自己编写连接到数据库的部分。问题是,它会返回数据,但也会阻塞其他所有内容。如果查询 1 需要 20 秒,查询 2 只需要 3 秒,我调用查询 1 再调用查询 2,查询 2 只会在查询 1 完成后显示,从而阻止所有潜在用户!这是我的代码的一部分,如果您需要更多,请询问

这是请求处理程序之一,最后 2 个参数用于测试。

function start(response){
        console.log("Request handler 'insertHood' was called.");
        response.writeHead(200, {"Content-Type": "text/html"});
        var result = db.execute('select x(country_location), y(country_location), country_name, zoom_level from country', response, "Query 1 ", 10);
    }

这是 database.js 文件中的函数

function execute(query, response, msg, sleepz) {
  var result = sequelize.query(query)
  .success(function(rows)
    {
      sleep(sleepz);
      response.write(msg + JSON.stringify(rows));
      console.log(msg + (new Date()));
      response.end();
    }
  ).error(function(e) {
      console.log("An error occured", e);
      response.write("there was an error man, yo yoy oy");
      response.end();
    }
  );
}

我知道 .success 和 .error 是回调函数,但我似乎无法找到使它们异步的方法,我读到了一个异步库,但我认为它不能满足我的需要,我确定我做错了什么,什么是吗?

4

1 回答 1

1

你的sleep功能是你的问题的原因。

当您在 Node 中创建繁忙的等待循环时,您实际上停止了 Node 处理任何 I/O 的能力,例如接受新连接、读/写文件、查询数据库等。

如果您想延迟发回响应,您需要一个异步解决方案。幸运的是,有setTimeout

.success(function(rows) {
  setTimeout(function() {
    response.write(msg + JSON.stringify(rows));
    console.log(msg + (new Date()));
    response.end();
  }, sleepz); // milliseconds
})
于 2013-10-12T19:33:43.680 回答