繁体   English   中英

Meteorjs:HTTP.get正在检索数据,但未向帮助程序函数变量返回任何内容

[英]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都不会给我任何东西。

这里有两个基本问题:

  1. 不需要时,您正在异步使用HTTP.get
  2. 当您无法同步使用Meteor.call时,您将尝试同步使用它,因为它将无法正常工作。

说明1:

在向HTTP.get提供回调时,您要告诉Meteor允许代码执行继续到该行之外,然后将调用结果传递给回调函数。 结果,实际的方法函数将完成执行,并且将在未返回实际的HTTP调用之前,返回undefined (通过EJSON作为null传递回调用函数)。 发生这种情况时,结果将被记录下来,但是即使您在回调中 return结果,封闭方法函数也不会在意,因为它早已完成执行。

有几种方法可以解决此问题,最简单的方法是: 不要传递callback 在服务器上,可以通过不传递回调HTTP.get同步使用HTTP.get ,在这种情况下,代码将停止执​​行,直到结果返回为止,并且实际上会将它们返回给客户端。 请注意,如果在客户端上使用HTTP.get则无法执行此操作。 处理此问题的其他方式包括期货承诺 (更好),但此处不必要。

2的说明

解决起来比较复杂,但是对于Meteor和Javascript来说却是基础。 如果您正在调用异步函数并且想要使用结果,则需要提供一个回调(或使用promises)。 您不能仅仅因为上面提到的相同原因而期望它可以内联工作。 因此,需要进行一些更改:

  1. 不要在模板助手中调用方法。 您不知道模板帮助程序将运行的频率(取决于各种反应性事物),因此,这实际上是您要提交的Websocket上无限制的流量。 在发生某些情况(呈现模板,事件处理程序,特定的数据更改(即在autorun块内))发生时调用它们,但在辅助函数中则不能调用它们。

  2. 将结果存储在反应性数据源中,否则,即使您成功接收到结果并将其放置在某个地方,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}}

一些注意事项:

  • 您需要安装react-var软件包,该软件包不是开箱即用的,它无法正常工作: meteor add reactive-var
  • 您可以通过使用Template.instance().places.get()的模板帮助程序返回数据,但是您可以在模板中内联地进行处理,这对我来说似乎更容易。
  • 如果第一个方法调用的结果不足,并且您需要更新结果,请在事件处理程序或根据需要的自动运行块中进行更新。 如果服务器需要能够直接数据送到客户端,而不是等待更新请求,那么方法是错误的工具-您需要使用Meteor的发布/订阅模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM