流星JS中的Deps自动运行

Deps autorun in Meteor JS

本文关键字:运行 Deps JS 中的 流星      更新时间:2023-09-26

决定今天测试一下Meteor JS,看看我是否有兴趣用它来构建我的下一个项目,并决定从Deps库开始。

为了快速测试此功能,我使用500px API来模拟变化。在快速阅读了文档之后,我想我应该在我的本地盒子上有一个工作示例。

该函数似乎只自动运行一次,这不是如何应该是基于我在流星这个功能的初步理解工作。

如有任何建议,我将不胜感激。提前谢谢。
if (Meteor.isClient) {
  var Api500px = {
    dep: new Deps.Dependency,
    get: function () {
      this.dep.depend();
      return Session.get('photos');
    },
    set: function (res) {
      Session.set('photos', res.data.photos);
      this.dep.changed();
    }
  };
  Deps.autorun(function () {
    Api500px.get();
    Meteor.call('fetchPhotos', function (err, res) {
      if (!err) Api500px.set(res);
      else console.log(err);
    });
  });
  Template.photos.photos = function () {
    return Api500px.get();
  };
}
if (Meteor.isServer) {
  Meteor.methods({
    fetchPhotos: function () {
      var url = 'https://api.500px.com/v1/photos';
      return HTTP.call('GET', url, {
        params: {
          consumer_key: 'my_consumer_key_here',
          feature: 'fresh_today',
          image_size: 2,
          rpp: 24
        }
      });
    }
  });
}

欢迎来到Meteor!在给出实际答案之前,有几件事需要指出……

  1. 会话变量已经内置了响应性,所以当你使用它们时,你不需要使用Deps包来添加Deps.Dependency属性。这并不是建议你不应该像这样滚动你自己的响应对象,但是如果你这样做,那么它的getset函数应该返回和更新对象的正常javascript属性(如value),而不是会话变量,由dep属性的dependchanged方法提供的响应性。另一种选择是直接使用Session变量,根本不用担心Api500px对象。

  2. 我不清楚你在这里想要达到什么反应-如果应该道歉。您是否打算在无限循环中重复运行fetchPhotos,以便每次返回结果时再次调用函数?如果是这样,这真的不是最好的处理方法——订阅服务器发布(使用Meteor.subscribeMeteor.publish),获取这个发布函数以所需的任何规律运行API调用,然后将结果发布到客户端会好得多。这将大大减少客户端与服务器之间的通信,但最终结果相同。

说了这么多,为什么它只运行一次?想到的两种可能的解释是,返回了一个错误(因此Api500px.set从未被调用),或者如果新值与现有值相同,Session.set调用实际上不会触发依赖changed事件。然而,在后一种情况下,我仍然希望你的函数重复运行,因为你有自己的dependchanged结构围绕会话变量,它不实现自我限制的逻辑,所以在自动运行中有Api500px.get应该意味着它在Api500px.set返回时重新运行,即使Session.set内部实际上没有做任何事情。如果不是前一种诊断,那么我就把看到的所有东西都记录下来,然后答案就会自动出现。