今天决定测试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
}
});
}
});
}
答案 0 :(得分:2)
欢迎来到流星!在实际回答之前要指出的几点事情......
会话变量内置了反应性,因此您在使用它们时不需要使用Deps包添加Deps.Dependency
属性。这并不是说你不应该像这样推送你自己的被动对象,但如果你这样做,那么它的get
和set
函数应该返回并更新正常的javascript属性对象(例如value
),而不是Session变量,其反应性由depend
属性的changed
和dep
方法提供。另一种方法是直接使用Session变量,而不必费心使用Api500px
对象。
我不清楚你在这里试图做出什么反应 - 如果它应该是道歉的话。您是否打算在无限循环中重复运行fetchPhotos
,这样每次返回结果时都会再次调用该函数?如果是这样,它确实不是最好的做事方式 - 订阅服务器出版物(使用Meteor.subscribe
和Meteor.publish
)会更好,获取此出版物功能以任何规定的规律运行API调用,然后将结果发布到客户端。这将大大减少客户端 - 服务器通信的相同净结果。
说了这么多,为什么它只运行一次?我想到的两个可能的解释是返回错误(因此永远不会调用Api500px.set
),或者Session.set
调用实际上不会触发依赖{如果新值与现有值相同,则为{1}}事件。但是,在后一种情况下,我仍然期望你的函数重复运行,因为你有自己的changed
和depend
结构围绕Session变量,它没有实现自限制逻辑,所以{自动运行中的{1}}应该意味着它会在changed
返回时重新运行,即使其中的Api500px.get
实际上没有做任何事情。如果它不是以前的诊断,那么我只需记录所有内容,答案就应该出现。