2016-08-06 2 views
0

Здравствуйте, я хочу создать задержку в моем методе на стороне сервера Meteor, когда я выполняю итерацию по коллекции. Метод 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

нет на каждой итерации я хочу ждать данных [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 Для переменной:

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 Вы можете делать то, что вы хотите с объектом 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. 
    }); 
}); 
+0

, но im не ждет фиксированное время, в коллекции есть поле длительности, которое задерживает время задержки (данные [i] .duration). –

+0

См. Редактирование, которое я собираюсь сделать –

+0

Это initiailly ждет данных [i] .duration, а затем повторяет всю коллекцию и публикует ее. Идея - данные wait [i] .duration для каждой строки в коллекции, а затем опубликовать ее. Еще одно странное поведение - исключение: Ошибка: connect ETIMEDOUT –

0

Другой подход заключается в следующем, но после 30 итераций это не задерживает время продолжительности поля и повторяет случайное значение между 1-10 секундами. Кстати, у меня есть тысячи документов в моем db.

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

 Смежные вопросы

  • Нет связанных вопросов^_^