[英]Meteorjs: HTTP.get is retrieving data but isn't returning anything to the helper function variable
我有以下代码读取json文件:
Meteor.methods({
getPlaces: function(){
return HTTP.get(Meteor.absoluteUrl("/places.json"), function(e, r) {
console.log(r.data);
return r.data;
});
}
})
控制台显示其检索数据就很好。 这是我要在其中显示“位置”的模板的帮助器功能的一部分:
testing: function(){
return Meteor.call("getPlaces");
}
&这是我应该在模板中显示的循环:
{{#each testing}}
<li>{{testing.name}}</li>
{{/each}}
但是似乎我没有正确调用该函数,因为循环未显示任何内容。 我已经通过给它提供可以正常工作的随机数据来测试了循环,但是无论何时我直接在“测试”中调用Meteor.call甚至HTTP.get都不会给我任何东西。
这里有两个基本问题:
HTTP.get
。 Meteor.call
时,您将尝试同步使用它,因为它将无法正常工作。 在向HTTP.get
提供回调时,您要告诉Meteor允许代码执行继续到该行之外,然后将调用结果传递给回调函数。 结果,实际的方法函数将完成执行,并且将在未返回实际的HTTP调用之前,返回undefined
(通过EJSON作为null
传递回调用函数)。 发生这种情况时,结果将被记录下来,但是即使您在回调中 return
结果,封闭方法函数也不会在意,因为它早已完成执行。
有几种方法可以解决此问题,最简单的方法是: 不要传递callback 。 在服务器上,可以通过不传递回调HTTP.get
同步使用HTTP.get
,在这种情况下,代码将停止执行,直到结果返回为止,并且实际上会将它们返回给客户端。 请注意,如果在客户端上使用HTTP.get
, 则无法执行此操作。 处理此问题的其他方式包括期货或承诺 (更好),但此处不必要。
解决起来比较复杂,但是对于Meteor和Javascript来说却是基础。 如果您正在调用异步函数并且想要使用结果,则需要提供一个回调(或使用promises)。 您不能仅仅因为上面提到的相同原因而期望它可以内联工作。 因此,需要进行一些更改:
不要在模板助手中调用方法。 您不知道模板帮助程序将运行的频率(取决于各种反应性事物),因此,这实际上是您要提交的Websocket上无限制的流量。 在发生某些情况(呈现模板,事件处理程序,特定的数据更改(即在autorun
块内))发生时调用它们,但在辅助函数中则不能调用它们。
将结果存储在反应性数据源中,否则,即使您成功接收到结果并将其放置在某个地方,UI也不会使用结果进行更新。
所以:
Template.yourTemplate.onCreated(function () {
this.places = new ReactiveVar()
Meteor.call("getPlaces", (err, res) => {
// do some error handling here
this.places.set(res)
})
})
{{#each Template.instance.places.get}}
<li>{{name}}</li>
{{/each}}
一些注意事项:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.