Meteor方法即使在使用回调后也在客户端返回未定义的
我试图在服务器上使用meteor方法从AirVisualAPI获取数据,并将其传递给客户端。已在服务器上成功接收数据。但是,当在模板帮助器中调用该方法时,该模板帮助器将处于未定义状态 客户端帮助程序:Meteor方法即使在使用回调后也在客户端返回未定义的,meteor,methods,server,callback,client,Meteor,Methods,Server,Callback,Client,我试图在服务器上使用meteor方法从AirVisualAPI获取数据,并将其传递给客户端。已在服务器上成功接收数据。但是,当在模板帮助器中调用该方法时,该模板帮助器将处于未定义状态 客户端帮助程序: Template.index.helpers({ getCityDataOnClient: function(city, state) { Meteor.call('getCityData', city.toLowerCase(), state.toLowerCase(
Template.index.helpers({
getCityDataOnClient: function(city, state) {
Meteor.call('getCityData', city.toLowerCase(), state.toLowerCase(), function(error, result) {
if(!error) {
console.log(result); //returns undefined
}
else {
console.log(error);
}
});
}
});
库文件夹中的Meteor methods.js:
Meteor.methods({
getCityData : function(city, state) {
var data = [];
const result = HTTP.call('GET', 'http://api.airvisual.com/v2/city', {
params: {
state: state,
city : city,
country: 'pakistan',
key: 'xxxxxxxxxx'
}
}, function(err, res) {
if (!err) {
data = res.data.data;
//console.log(data); //prints correct data on the server and client
return data;
}
else {
console.log(err);
return err;
}
});
}
});
我已经找到了类似问题的答案。任何东西似乎都不起作用,包括跟踪器、反应式var和反应式方法。这里的问题是,您试图将回调函数中的数据返回到1。不是在等你,而是2。他已经回来了 谢天谢地,Meteor在服务器上做了一些神奇的事情,使像HTTP.call这样的异步调用看起来是同步的。 您的方法可以这样做:
Meteor.methods({
getCityData : function(city, state) {
const result = HTTP.call('GET', 'http://api.airvisual.com/v2/city', {
params: {
state: state,
city : city,
country: 'pakistan',
key: 'xxxxxxxxxx'
}
});
return result.data.data;
}
});
通过排除Meteor HTTP模块上的回调,Meteor将在光纤中运行该模块,并在继续执行之前等待结果(与async/await类似)
如果使用第三方库进行HTTP请求,则需要使用
Meteor.wrapAsync
包装函数,以获得在光纤中运行的好处。或者,您可以将其包装在承诺中,并从方法返回承诺的可能副本的可能副本现在很有意义。非常感谢。