2014-09-05 63 views
1

當用戶點擊一個按鈕時,我必須對數據庫進行聚合查詢,但是我不知道如何將該結果返回給客戶端,因爲我正在執行一個異步請求,這是我的代碼的一部分:如何將數據推回流星的客戶端?

//Server side 
Meteor.startup(function() { 
    Meteor.methods({ 
     getAllTotals: function (query){ 
      var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db; 
      var error = result = match = pipeline = ''; 
      var group = { 
       $group: { 
        _id: null, 
        wall_clock: { 
         "$sum": "$wall_clock" 
        }, 
        mem:{ 
         "$sum": "$mem" 
        }, 
        cpu:{ 
         "$sum": "$cpu" 
        }, 
        io:{ 
         "$sum": "$io" 
        }, 
        vmem:{ 
         "$sum": "$vmem" 
        }, 
        maxvmem:{ 
         "$sum": "maxvmem" 
        } 
       } 
      }; 

      if(typeof query.submission_time !== "undefined"){ 
       match = {"$match": {submission_time: query.submission_time}}; 
       pipeline = [match, group]; 
      }else{ 
       pipeline = [group]; 
      } 

      db.collection("GE_qstat_job_monitor").aggregate(
       pipeline, 
       Meteor.bindEnvironment(
        function (error, result){ 
         console.log(result); // <<--- this is OK! 
        }, 
        function(error) { 
         Meteor._debug("Error doing aggregation: " + error); 
        } 
      ) 
     ); 
      return result; // <<--- this is empty 
     } 
    }); 
} 

有什麼建議嗎? :-)

回答

1

簡短的回答:

解決方案,您可以在這裏找到:

詳細的解答

使用Meteor._wrapAsync

var aggregateTotal = function(callback){ 
     var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db; 

     // ... 

     db.collection("GE_qstat_job_monitor").aggregate(
       pipeline, 
       function (error, result){ 
       if(error){ 
        callback(error); 
       }else{ 
        callback(null, result); 
       } 
       } 
    ); 
    } 

    var aggregateTotalsSync = Meteor._wrapAsync(aggregateTotal); 

    Meteor.methods({ 
     'getAllTotals': function(){ 
      var result; 
      try{ 
       result = aggregateTotalsSync(); 
      }catch(e){ 
       console.log("getAllTotals method returned error : " + e); 
      }finally{ 
       return result; 
      } 
     } 
    }); 

利用期貨(meteorPad example

//Server side 
Meteor.startup(function() { 
    var Future = Npm.require('fibers/future'); 
    Meteor.methods({ 
     getAllTotals: function (query){ 
      var fut = new Future(); 
      var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db; 

      // ... 

      db.collection("GE_qstat_job_monitor").aggregate(
       pipeline, 
       Meteor.bindEnvironment(
        function (error, result){ 
        if(error){ 
         fut.throw(error); 
        }else{ 
         fut.return(result) 
        } 
        }, 
        function (exception){ 
        // caught exception is passed to this callback 
        fut.throw(exception); 
        } 
      ) 
     ); 
      return fut.wait(); 
     } 
    }); 
} 
+0

未來選項工作完美無缺!謝謝! :-) – 2014-09-08 14:52:23

0

容易,但有點骯髒的方式(但沒有這麼多,如果你想好你的架構) - >發回的結果低谷蒙戈。 你甚至可以在沒有Meteor.methods的情況下做到這一點,創建請求在客戶端的數據庫中插入,服務器上的觀察者檢查並執行異步任務,然後將結果寫回數據庫。