2

在很多情况下我必须进行两个相互依赖的数据库查询。但是由于 js 的异步特性,我无法设置这些查询请求的顺序。我一直在使用的解决方法是将其中一个查询放在另一个查询的回调中。我的方法似乎可行,但我只想知道是否有更好的方法来做到这一点?

示例代码:

app.get('/tweet', function(req,res){

  User.findOne({ twitterID: req.user.id },
    function(err, user) { 
        if (user){
             var votedPosts = user.votedPosts;
                Post.find(function (err, posts) {
                    if(posts){
                    for (var i = 0; i < posts.length; i++){
                        for (var j = 0; j < votedPosts.length; j++){
                          if(votedPosts[j]._id == posts[i]._id){
                            posts[i].votetype = votedPosts[j].votetype;
                          }
                          else{
                            console.log("this is getting called");
                            posts[i].votetype = 0;
                          }
                        }
                    }
                    res.send(posts);
                  }
                });
          }
    });
});
4

1 回答 1

3

是的,有很多很多流控制库来解决深度嵌套的回调问题。我推荐asyncnimble,但promises是另一种解决这个问题的流行模式。

添加代码并且随着时间的推移它变得更长和更深的嵌套的基本进展是:

  • 用少量代码处理 1 或 2 个嵌套级别。它没有那么坏。
  • 将内容提取到顶级命名函数并调用它们(大多数 node.js 核心代码试图不超出这一点)
  • 使用库(自定义 API 或基于承诺模式)

节点 wiki 上有很长的流量控制模块列表。你也可以搜索 npm

于 2013-06-19T20:04:56.347 回答