2016-08-06 14 views
0

こんにちは私は、コレクションを反復しているときに流星のサーバー側の方法で遅延を作りたいと思っています。 Meteor._sleepForMsメソッドは例外を発生させ、毎回自分のアプリケーションを再起動します。 コレクションの繰返しを遅らせる方法はありますか?収集による反復の流行遅れ

Meteor.methods({ 
.... 
start: function() { 
let data = Strategy.find({}, {limit: 5}).fetch(); 
     for (let i = 0; i < data.length; ++i) { 
      mqttClient.publish("test", data[i].charge); 
      Meteor._sleepForMs(data[i].duration*1000); 
     } 
    } 
+0

したがって、反復が完了するまでメソッドが待機するようにします。右? – sapna

+0

各繰り返しでは、wait data [i] .duration times –

答えて

1

使用Meteor.setTimeout

start: function() { 
    Meteor.setTimeout(function() { 
    let data = Strategy.find({}, {limit: 5}).fetch(); 
    for (let i = 0; i < data.length; ++i) { 
     mqttClient.publish("test", data[i].charge); 
    } 
    }, 1000); 
} 

ともwhy to use that vs vanilla setTimeout()を参照してください。変数については

EDIT:あなたはRawCollectionオブジェクトとやりたいことができ

start: function() { 
    let data = Strategy.find({}, {limit: 5}).fetch(); 
    for (let i = 0; i < data.length; ++i) { 
    Meteor.setTimeout(function() { 
     mqttClient.publish("test", data[i].charge); 
    }, data[i].duration); 
    } 
} 

EDIT、

var rawCollection = Strategy.rawCollection(); 
// Number.MAX_SAFE_INTEGER should be sufficient time 
var cursor = rawCollection.find({}).maxTimeMS(Number.MAX_SAFE_INTEGER); 
var myData = fetchCursor(cursor); 

var fetchCursor = Meteor.wrapAsync(function 
    fetchCursor (cursor, cb) { 
    cursor.each(function (err, doc) { 
     if (err) return cb(err); 
     if (!doc) return cb(null, { done: true }); // no more documents 

     // use doc here. 
    }); 
}); 
+0

が必要ですが、一定時間待たずに、コレクションには遅延時間(data [i] .duration)をinidicatesするdurationフィールドがあります。 –

+0

私がやろうとしている編集を参照 –

+0

これは、イニシャルにdata [i] .durationを待ってから、コレクション全体を反復して公開します。アイデアは、コレクション内の各行のデータを待機させてから、それを公開することです。別の奇妙な動作は例外です:エラー:connect ETIMEDOUT –

0

にそのmaxTimeMSを設定する別のアプローチは、以下のとおりであるが、 30回の反復後には、持続時間フィールド時間を遅延させず、1~10秒の間のランダム値を反復する。 私のデータベースには何千ものドキュメントがあります。

var Future = Npm.require('fibers/future'); 
       var future = new Future(); 
       Meteor.setTimeout(function() { 
        future.return(); 
        let d = `${moment(data[i].t).format("YYYY-MM-DD HH:mm:ss")} ${data[i].field}`; 
        mqttClient.publish("test", d); 
       }, data[i].duration*1000); 
       future.wait(); 
関連する問題