我正在尝试使用服务器上的meteor方法从AirVisual API获取数据并将其传递给客户端。数据已在服务器上成功接收。但是,在调用方法时,模板助手会被取消定义。
客户助手:
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);
}
});
}
});
lib文件夹中的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;
}
});
}
});
我已经找到了类似问题的答案。似乎没有任何效果,包括Tracker,reactive-var和reactive-methods。
答案 0 :(得分:2)
这里的问题是你试图将数据从回调内部返回到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
包装该函数以获得在光纤中运行的好处。或者你可以将它包装在一个promise中并从方法中返回promise