Deps在Meteor JS中自动运行

时间:2014-08-24 19:16:34

标签: javascript meteor

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

为了快速测试此功能,我使用500px API来模拟更改。在快速阅读完文档之后,我想我会在我的本地框中有一个有效的例子。

根据我对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
        }
      });
    }
  });
}

1 个答案:

答案 0 :(得分:2)

欢迎来到流星!在实际回答之前要指出的几点事情......

  1. 会话变量内置了反应性,因此您在使用它们时不需要使用Deps包添加Deps.Dependency属性。这并不是说你不应该像这样推送你自己的被动对象,但如果你这样做,那么它的getset函数应该返回并更新正常的javascript属性对象(例如value),而不是Session变量,其反应性由depend属性的changeddep方法提供。另一种方法是直接使用Session变量,而不必费心使用Api500px对象。

  2. 我不清楚你在这里试图做出什么反应 - 如果它应该是道歉的话。您是否打算在无限循环中重复运行fetchPhotos,这样每次返回结果时都会再次调用该函数?如果是这样,它确实不是最好的做事方式 - 订阅服务器出版物(使用Meteor.subscribeMeteor.publish)会更好,获取此出版物功能以任何规定的规律运行API调用,然后将结果发布到客户端。这将大大减少客户端 - 服务器通信的相同净结果。

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