2017-02-09 4 views
0

Unten ist mein Controller für die Abstimmung über einen Beitrag.Wie kann ich mehrere Zählungen durchführen und die höchsten verwenden, wenn sie alle versprechen?

Wenn der Benutzer nicht bereits für die Post abgestimmt hat (ihre voterId ist nicht im votes Array vorhanden). Dann wird ihr vote hinzugefügt, indem man ihre voterId in das votes Array der Post drückt. Der voteCount wird dann auf den length dieses Arrays zurückgesetzt.

Es gibt einige zusätzliche Logik beim Senden von Benachrichtigungen an die postAuthor, aber ich habe diesen Code weggelassen, um das Problem nicht zu verschleiern.

Jeder post hat einen expiresAt Zeitstempel. Jede Stimme gibt der post etwas mehr Zeit zu leben (TTL), aber wie viel Zeit es geben wird, hängt davon ab, welcher category, dem der Beitrag gehört. Im Wesentlichen geben die populäreren Kategorien wie Musik weniger TTL als eine weniger beliebte Kategorie, vielleicht Gartenarbeit.

Also was ich tun muss, ist count, wie viele users haben die category als Interesse. Basierend darauf kann ich berechnen, wie viel TTL hinzugefügt werden soll.

Das Problem ist, dass jeder Beitrag bis zu drei Kategorien haben kann. Wie viele auch immer, ich möchte die Liste der beliebtesten der Kategorien nehmen.

Wie kann ich das tun? Ich dachte daran, eine for loop für jede Kategorie durchzuführen, die der post gehört. Dann die Zählung nehmen, mit der letzten Zählung vergleichen und wo nötig zuweisen.

Natürlich ist das Problem damit, dass jeder Count, ein Versprechen zurückgibt. Also ich nehme an, for loop wird nicht funktionieren.

Gibt es eine logische Lösung? Danke

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); 
    }, 
+0

Haben Sie Ihre for-Schleife schieben alle User.count() in ein Array aufruft. Füttere dieses Array in eine 'Promise.all()', Sobald die Promise.all() aufgelöst wird, hast du alle Kategorien und kannst den Follower-Count-Vergleich in den Callback einfügen. – Shilly

Antwort

1

Dies ist keine vollständige Umsetzung, nur zeigen, was ich in meinem Kommentar bedeuten:

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); 
} 
+0

fantastisch, danke! – bloppit

Verwandte Themen