这是我在这里的第一篇文章,我希望我做得对。 我正在学习我想做的项目的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是回调函数,但我似乎无法找到使它们异步的方法,我读到了一个异步库,但我不认为它做我需要的东西,我确定我做的事情错了,这是什么?
答案 0 :(得分: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
})