gpt4 book ai didi

javascript - Meteorjs : HTTP. get 正在检索数据,但没有向辅助函数变量返回任何内容

转载 作者:行者123 更新时间:2023-11-28 18:55:11 25 4
gpt4 key购买 nike

我有以下读取 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 传递回调用函数)回。发生这种情况时,结果将被记录,但即使您在回调返回结果,封闭的方法函数也不会关心,因为它会很久以前就完成了执行。

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

2的解释:

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

  1. 不要从模板助手中调用方法。您不知道模板助手的运行频率(它取决于各种 react 性事物),因此您所 promise 的 Websocket 上的流量本质上是无限量的。当发生某些事情时(模板呈现、事件处理程序、特定数据更改(即在 autorun block 内))调用它们,但不在辅助函数中调用它们。

  2. 将结果存储在响应式(Reactive)数据源中,否则即使您成功接收结果并将其放在某个位置,您的 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}}

一些注意事项:

  • 您需要安装reactive-var软件包,莫名其妙地没有提供开箱即用的,为此工作:meteor addreactive-var
  • 您可以通过使用 Template.instance().places.get() 的模板助手返回数据,但您可以在模板中内联执行此操作,这似乎更容易我。
  • 如果第一个方法调用的结果不够,并且您需要更新结果,请根据需要在事件处理程序或自动运行 block 中执行此操作。如果服务器需要能够将数据直接推送到客户端而不是等待更新请求,那么方法是错误的工具 - 您需要使用 Meteor 的 pub/sub模型。

关于javascript - Meteorjs : HTTP. get 正在检索数据,但没有向辅助函数变量返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33738646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com