Meteor.js Tracker.autorun / Tracker.depend для экспортируемой переменной со стороны сервера с заданным интервалом - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь разобраться с функциями Mecker Tracker.autorun и Tracker.dependancy.

Я пытаюсь сделать что-то, что кажется мне простым, но я изо всех сил пытаюсь выполнить.

У меня есть функция на стороне сервера, которую я регистрирую как метод:

let count = 0

setInterval(()=>{
    count ++
    return count
}, 1000)

export default count

Зарегистрируйтесь как метод:

import count from './setIntervarl'

Meteor.methods({
    getData:function() {
      return count
    }
  });

И затем вызовите клиентside:

import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
import { Tracker } from 'meteor/tracker'

import './main.html';

// Setup reactive variable
rv1 = new ReactiveVar(9)

Meteor.call('getData', function(error, results) {
  if(error){
          console.log("error:"+error);
      } else {
      rv1.set(results)
      }
});

// Display the output from reactiveVar
Template.someData.helpers({
  someData: function() {
    return rv1.get();
  }
})

Может кто-нибудь показать мне, как использовать Tracker.autorun или Tracker.dependancy, чтобы мой пользовательский интерфейс обновлялся с интервалом, который установлен в моей функции на стороне сервера

I 'У меня действительно есть проблемы с этим.

Большое спасибо

1 Ответ

2 голосов
/ 30 октября 2019

Здесь не будет никакой реактивности. Методы Meteor не являются реактивными, а представляют собой только завернутый вызов ddp к конечной точке сервера (rpc-), которая возвращает что-то.

Чтобы получать реактивные данные от сервера, необходимо подписаться на публикацию. Если вы хотите опубликовать только этот счетчик, вы можете создать коллекцию с одним документом и опубликовать ее.

import / CountCollection.js (оба)

export const CountCollection = new Mongo.Collection('myCounter')

server / counter.js (сервер)

import { CountCollection } from '../imports/CountCollection'


let counterDocId

Meteor.startup(() => {
  // optional: clear the collection on a new startup
  // this is up to your use case
  // CountCollection.remove({})

  // create a new counter document
  counterDocId = CountCollection.insert({ count: 0 })

  // use the Meteor.setInterval method in order to
  // keep the Meteor environment bound to the execution context
  // then update the counter doc each second
  Meteor.setInterval(function () {
    CountCollection.update(counterDocId, { $inc: { count: 1 } })
  }, 1000)
})

// Now we need a publication for the counter doc. 
// You can use the `limit` projection to restrict this to a single document:
Meteor.publish('counterDoc', function () {
  if (!counterDocId) this.ready()
  return CountCollection.find({ _id: counterDocId }, { limit: 1 })
})

Теперь вы можете подписаться на эту публикацию и получать оперативные обновления документа:

client /someData.js (клиент)

import { CountCollection } from '../imports/CountCollection'


import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
import { Tracker } from 'meteor/tracker'

import './main.html';

// Setup reactive variable
const reactiveCounter = new ReactiveVar(0)
const counterSubscription = Meteor.subscribe('counterDoc')

Template.someData.onCreated(() => {
  const instance = this

  instance.autorun(() => {
    // counterSubscription.ready() will re-called
    // when the publication released a new cursor
    // which causes the autorun to re-run = reactivity
    if (counterSubscription.ready()) {
      // there is only 1 doc published, so no query require
      const counterDoc = CountCollection.findOne() 
      reactiveCounter.set(counterDoc && counterDoc.count)
    }
  })
})

// Display the output from reactiveVar
Template.someData.helpers({
  someData: function() {
    return reactiveCounter.get()
  }
})

Sidenote:

не забудьте получить правильные пути и импортировать

Показания:

https://docs.mongodb.com/manual/reference/operator/update/inc/

https://docs.meteor.com/api/timers.html#Meteor-setInterval

...