【发布时间】:2019-06-18 03:48:57
【问题描述】:
我来自 php 背景,其中 sql 查询被阻塞。
我通常的设置是创建一个try, catch 块来处理表更新期间可能发生的任何错误。我想将这个逻辑转移到 nodejs,但它的异步性质使得这很麻烦。看一下示例代码:
var httpServer = Https.createServer(httpsOptions, function (request, response) {
try {
//many queries in if-else, switch statements
if(something){
mysqlConnection.query(query,[],function(err, result){});
}else{
//many queries will follow
if(somethingelse){
mysqlConnection.query(query2,[],function(err, result){});
}else{
mysqlConnection.query(query3,[],function(err, result){});
if(andsoon){}
}
}
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("Got it.");
console.log("Response successful");
}catch(error){
console.error(error);
response.writeHead(400, { "Content-Type": "text/plain" });
response.end("Error.");
}
}).listen(8000);
所以,response.end() 将在查询执行之前触发,所以我在知道查询是否成功之前发送消息。我可以将response.end() 代码包装在回调中,但是有很多查询正在执行,所以现在我必须跟踪到目前为止执行了多少。情况变得更糟,1 个 if-else 控制流只需要 1 个查询,而其他一些则需要 10 个,因此在代码完成时进行跟踪会产生疯狂的开销。
这一切都不是最佳的工作流程。如果您有一个复杂的查询系统,并且您希望仅在所有查询都执行(或失败)后才发送响应,您会怎么做?
【问题讨论】:
标签: mysql node.js asynchronous promise synchronous