Метеорная задержка в итерации через сбор
Здравствуйте, я хочу создать задержку в моем метеорологическом серверном методе, когда я перебираю коллекцию. Метод 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);
}
}
2 ответа
Использование 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.
});
});
Другой подход заключается в следующем, но после 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();