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()

编辑对于变量:

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 回答
0

另一种方法如下,但在 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();
于 2016-08-11T15:12:07.970 回答