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);
        }
  }
4

2 に答える 2

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

また、バニラの setTimeout() に対してそれを使用する理由も確認してください。

EDIT変数の場合:

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

編集RawCollection オブジェクトを使用して、その maxTimeMS を設定して、必要なことを行うことができます

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.
  });
});
于 2016-08-06T12:42:12.527 に答える