2016-11-11 63 views
1

我有以下query`s:貓鼬/ MongoDB的最好的方法來計算統計

function calculate_stats() { 
     Users.count().then(function(allusers) { 
       Users.count().then(function(dead_users) { 
        Users.count().then(function(banned_users) { 
         Users.count().then(function(vacation_users) { 
          Users.count().then(function(in_hotel_users) { 
           var aliveusers = allusers - dead_users - banned_users; 
           var accounts = { 
            registred: allusers, 
            alive: aliveusers, 
            dead: dead_users, 
            banned: banned_users, 
            vacation: vacation_users, 
            inhotel: in_hotel_users, 
            outsidehotel: aliveusers - in_hotel_users, 
            outsidehotelonline: 0 
           }; 
          }); 
         }); 
        }); 
       }); 
      }); 



     }); 
    } 

,但確實是最好的辦法給他們巢這樣,才能得到最終的結果? 我將如何開始獲得計算統計數據的好方法。

這不是性能無效嗎?

+0

當我看到許多嵌套的回調,我認爲在hadouken使用一個承諾庫像Q(使用Q.all方法)創建的所有組合的承諾,或者使用使用Promise.all。使用諾言更可讀。 –

+0

您能否使用我的示例代碼提供示例? @LucasCosta – maria

回答

3

由於所有查詢看起來彼此獨立,因此可以並行執行它們。您可以使用,如果ES6

function calculate_stats() { 
    var promiseArr = [ 
     Users.count(), 
     Users.count(), 
     Users.count(), 
     Users.count(), 
     Users.count() 
    ] 

    Q.all(promiseArr).then(function (results) { 
     var allusers = results[0]; 
     var dead_users = results[1]; 
     // and so on 

     var aliveusers = allusers - dead_users - banned_users; 
     var accounts = { 
      registred: allusers, 
      alive: aliveusers, 
      dead: dead_users, 
      banned: banned_users, 
      vacation: vacation_users, 
      inhotel: in_hotel_users, 
      outsidehotel: aliveusers - in_hotel_users, 
      outsidehotelonline: 0 
     }; 
    }) 

}); 
} 
+0

這將工作服務器雙方使用節點?:) – maria

+0

是上面的代碼是爲NodeJS – hyades