我正在尝试运行多个SQL查询。
问题在于,由于fire.and-forget node.js的使用,变量会超出范围。我正在尝试研究如何在C#中执行与await
关键字类似的操作。
这是我破碎的代码,原样;这应该让我更清楚我想要实现的目标:
function getTopicsForMessages(request, results)
{
//Get topics for this message
var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri";
queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes";
queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)";
queryString += " WHERE messageId = ?";
for (var i = 0; i < results.length; i++)
{
mssql.query(queryString, [results[i].id],
{
success: function (topicsResults)
{
results[i].topics = topicsResults;
},
error: function (err) {
console.error("SQL Read error: " + err);
request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read");
}
});
}
//Continue... once all queries have executed successfully.
}
我认为这只是一个不太了解节点做事方式的问题。
我已经阅读了Node.js的一些软件包/选项,它们允许类似于await关键字的东西,但是我不确定在使用Azure移动服务时是否可以使用它们。 / p>
我也确信我可以在SQL中以某种方式更好地执行此查询。但同样,我不太确定如何。
非常感谢,
丹尼
答案 0 :(得分:0)
下面的代码显示了一种可能的实现方式。由于node.js中的所有数据库调用都是异步的,如果将它们运行到“常规”for循环中,您将同时向数据库发送所有调用,这可能会触发一些配额。下面的代码一次发送一个查询(通过等待一个调用完成以调用下一个调用)。您还可以并行发送一些查询(使用与this post中显示的批处理技术类似的内容)。
function getTopicsForMessages(request, results)
{
//Get topics for this message
var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri";
queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes";
queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)";
queryString += " WHERE messageId = ?";
var queryNextItem = function(i) {
if (i >= results.length) {
// All done
continuation();
} else {
mssql.query(queryString, [results[i].id],
{
success: function (topicsResults)
{
results[i].topics = topicsResults;
queryNextItem(i + 1);
},
error: function (err) {
console.error("SQL Read error: " + err);
request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read");
}
});
}
}
queryNextItem(0);
function continuation() {
//Continue... once all queries have executed successfully.
}
}