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