Javascript 流星JS中的Deps自动运行

Javascript 流星JS中的Deps自动运行,javascript,meteor,Javascript,Meteor,今天决定测试Meteor JS,看看我是否有兴趣用它来构建我的下一个项目,并决定从Deps库开始 为了快速测试这个特性,我使用500pxapi来模拟更改。在快速阅读了这些文档之后,我想我会在我的本地盒子上有一个它的工作示例 该功能似乎只自动运行一次,而根据我对Meteor中该功能的初步理解,它的工作原理并非如此 如有任何建议,将不胜感激。提前谢谢 if (Meteor.isClient) { var Api500px = { dep: new Deps.Dependency,

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

为了快速测试这个特性,我使用500pxapi来模拟更改。在快速阅读了这些文档之后,我想我会在我的本地盒子上有一个它的工作示例

该功能似乎只自动运行一次,而根据我对Meteor中该功能的初步理解,它的工作原理并非如此

如有任何建议,将不胜感激。提前谢谢

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

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

  • 会话变量具有内置的反应性,因此在使用它们时,不需要使用Deps包来添加
    Deps.Dependency
    属性。这并不是说你不应该像这样滚动你自己的反应对象,但是如果你这样做,那么它的
    get
    set
    函数应该返回并更新对象的一个普通javascript属性(比如
    value
    ),而不是一个会话变量,反应性由
    dep
    属性的
    dep
    方法提供。另一种方法是直接使用Session变量,而根本不使用
    Api500px
    对象

  • 我不清楚你在这里试图做出什么反应——如果应该的话,我道歉。您是否打算在无限循环中重复运行
    fetchPhotos
    ,以便每次返回结果时都再次调用该函数?如果是这样的话,这并不是最好的方法——最好订阅服务器发布(使用
    Meteor.subscribe
    Meteor.publish
    ),让这个发布函数以所需的规则运行API调用,然后将结果发布到客户端。这将大大减少客户机与服务器之间的通信,并产生相同的净结果


  • 既然如此,为什么它只运行一次呢?突然想到的两种可能的解释是:返回了错误(因此从不调用
    Api500px.set
    ),或者如果新值与现有值相同,
    Session.set
    调用实际上不会触发依赖项
    changed
    事件。但是,在后一种情况下,我仍然希望函数重复运行,因为会话变量周围有自己的
    dependent
    changed
    结构,它没有实现自限逻辑,因此,在自动运行中使用
    Api500px.get
    应该意味着它在
    Api500px.set
    返回时重新运行,即使它内部的
    会话.set
    实际上没有做任何事情。如果不是以前的诊断,那么我会记录下眼前的一切,然后答案就会出现。

    谢谢richsilv。不知道订阅/发布功能,并且能够正确实现它。