即使在使用回调之后,Meteor方法也会在客户端上返回undefined

时间:2018-03-28 05:00:07

标签: meteor methods server callback client

我正在尝试使用服务器上的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。

1 个答案:

答案 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