如果它们都是承诺,我怎样才能执行多项计数并使用最高计数?

时间:2017-02-09 12:27:34

标签: javascript node.js express mongoose promise

以下是我在投票上投票的控制人员。

如果用户尚未对帖子投票(voterId阵列中不存在votes。然后,将vote推送到帖子的voterId数组中,即可添加votes。然后voteCount重置为该数组的length

关于向postAuthor发送通知还有一些额外的逻辑,但我省略了该代码,以免混淆问题。

每个post都有expiresAt个时间戳。每次投票都会给post一些更长的生存时间(TTL),但是它将给予多少时间将取决于该帖子属于哪个category。从本质上讲,更受欢迎的类别,如音乐,将比不太受欢迎的类别(可能是园艺)提供更少的TTL。

所以我需要做的是count有多少users感兴趣category。基于此,我可以计算要添加多少TTL。

问题是任何帖子最多可能有三个类别。无论有多少,我想计算最受欢迎的类别。

我该怎么做?我在考虑为for loop所属的每个类别执行post。然后计算,与最后一次计数比较,并在必要时进行分配。

当然,问题在于每个Count都会返回一个承诺。所以我假设for loop不起作用。

这是否有合理的解决方案?谢谢

  votePost(req, res, next) {
    const postId = req.params.id;
    const voterId = req.body.voterId;

      Post.findById(postId)
        .then(post => {
          // let followerCount;
          // let mostPopularCategoryFollowerCount = 0;
          //
          // // for (let i = 0; i < post.categories.length; i++) {
          // //   followerCount = User.count({ interests: { $eq: post.categories[i] } })
          // //     .then(count => count);
          // //
          // //     if (followerCount > mostPopularCategoryFollowerCount) {
          // //       mostPopularCategoryFollowerCount = followerCount;
          // //     }
          // // }

          if (post.votes.indexOf(voterId) === -1) {
            post.votes.push(voterId);
            post.voteCount = post.votes.length;

            // DO STUFF HERE WITH FOLLOWER COUNT //

              post.save()
                .then(() => res.send(post));
          }
        })
        .catch(next);
  },

1 个答案:

答案 0 :(得分:1)

这不是一个完整的实现,只是在我的评论中显示我的意思:

votePost(req, res, next) {
    const postId = req.params.id;
    const voterId = req.body.voterId;

    Post.findById(postId)
        .then(function( post ) {
            Promise.all(
                post.categories.map(function( category ) {
                    return User.count({ interests: { $eq: category } });
                })
            )
            .then(function( counts ) {
                return counts.reduce(function( highest, next ) {
                    return highest > next ? highest : next;
                }, 0);
            })
            .then(function( mostPopularCategoryFollowerCount ) {
                // do stuff with the count
            })
            .catch(function( err ) {
                // error handling
            });
        })
        .catch(next);
}