【发布时间】:2016-11-16 14:00:19
【问题描述】:
我正在尝试在我的网站的给定帖子中检索我的 cmets,但由于 node.js 的异步性质,我无法构建嵌套 cmets。
getBlock([], function(){});
function getBlock(comments, callback) {
comments.forEach(function(comment) {
getChildComments(comment, function(err, children) {
if (children) {
getBlock(children, callback);
}
comment.Comments = children;
/* not sure how to decide when to be done?*/
callback(null, comments);
});
});
}
上面的代码适用于同步代码,但不适用于异步代码,因为我无法判断comments 何时包含要返回到浏览器的所有数据。
我试图跟踪递归调用,并在剩下 0 个调用时结束,但这有问题,有时会根据树结构提前返回。
【问题讨论】:
-
你好 Jack,在 DB 中有结构不是更好吗:idComment、idParentComment、idArticle、userName、userComment、dateAdd 或类似的东西......而不是只为给定选择所有 cmets idArticle 只使用一个数据库查询而不是只排序一次?
-
@JanJůna 这就是我之前尝试做的事情,尽管我认为我受到 ORM 的限制。 cmets 是嵌套的,并且 cmets 可以有自己的 cmets。我正在使用 sequelize 和 postgresql
-
您可以在 sequelize 中进行原始查询 - 请参阅:docs.sequelizejs.com/en/latest/docs/raw-queries 假设您的页面将被 100 个用户请求,您将运行所有这些递归查询一百次(对于每个客户端)将耗尽您数据库的资源..
-
您确实应该尝试在一两次行程中查询此数据,而不是递归循环。对于一个非常大的评论线程,这可能是一个巨大的性能瓶颈。
标签: javascript node.js asynchronous recursion sequelize.js