Meteor方法即使在使用回调后也在客户端返回未定义的

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(

我试图在服务器上使用meteor方法从AirVisualAPI获取数据,并将其传递给客户端。已在服务器上成功接收数据。但是,当在模板帮助器中调用该方法时,该模板帮助器将处于未定义状态

客户端帮助程序:

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
包装函数,以获得在光纤中运行的好处。或者,您可以将其包装在承诺中,并从方法返回承诺

的可能副本的可能副本现在很有意义。非常感谢。