gpt4 book ai didi

mysql - Node Mysql 异步多个查询

转载 作者:可可西里 更新时间:2023-11-01 07:02:36 24 4
gpt4 key购买 nike

我想知道处理嵌套 mysql 查询的最佳方法是 nodejs。

所以像这样:

connection.query("SELECT * FROM blogs ORDER BY time DESC", function(err, blogs, fields) {

for (blog in blogs) {

connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) {

blog.tags = tags

});

}

res.send(blogs)

});

这显然是行不通的,因为它是异步的。在获取标签之前已经返回了结果。

我一直在阅读有关 Node 和回调的文章,而 promises 似乎是可行的方法。但是我看不出在这个小例子中如何最好地使用它们。

谢谢!

最佳答案

所以你必须等待所有的回调返回,然后才能发送响应。如果我们为了简单而忽略错误处理和空结果,这可以类似于:

var callback = function(blogs) {
res.send(blogs);
}

connection.query("SELECT * FROM blogs ORDER BY time DESC", function(err, blogs, fields) {
var pending = blogs.length;

for (blog in blogs) {

connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) {
blog.tags = tags;

if (0 === --pending) {
callback(blogs);
}
});
}
});

对于 promise ,查看返回新 promise 的 Promise.all 函数。当数组中传递给它的所有 promise 都得到解决时,这个 promise 就会得到解决。对于 Q 库,它应该是这样的:

var getTags = function(blog) {
var deferred = Q.defer();
connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) {
blog.tags = tags;
deferred.resolve();
});
return deferred.promise;
}

var promises = blogs.map(getTags(blog));

Q.all(promises).then(res.send(blogs));

关于mysql - Node Mysql 异步多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24232350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com