Meteor wrapAsync / Node Fiber Future不工作

时间:2016-05-13 11:13:26

标签: javascript node.js meteor node-fibers meteor-methods

我正在尝试使用Meteor方法从一个API获取json数据,我尝试使用meteor wrapAsync以及Node Future。以下是我的代码:

模板助手 - 客户端

    getLocationTimebyAPI: function (company_location) {

    Meteor.call('getLocationTimebyAPIServerMethod', company_location, function(error, results){
    if(error){
        console.log('error',error.reason);
    } else {

        var localtime = results.data.data.time_zone[0].localtime
        var utcoffset = results.data.data.time_zone[0].utcOffset
        console.log(localtime+ ' '+utcoffset);

        var returntext = localtime+' (UTC '+utcoffset+')';
        return returntext;

     }
    });

    }

方法1:使用Meteor wrapAsync - 服务器端

'getLocationTimebyAPIServerMethod': function(company_location){

   var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=XXXXXX';

    var convertAsyncToSync  = Meteor.wrapAsync( HTTP.get ),
    resultOfAsyncToSync = convertAsyncToSync( apiurl );

    return resultOfAsyncToSync;


}

方法2:使用节点光纤未来 - 服务器端

'getLocationTimebyAPIServerMethod': function(company_location){

    // use the node fibers npm
    var Future = Npm.require('fibers/future');

   var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=XXXXXXXX';

    // Create our future instance.
    var future = new Future();

    HTTP.get( apiurl, {}, function( error, response ) {
      if ( error ) {
    future.return( error );
      } else {
    future.return( response );
      }
    });

    return future.wait();


}

在这两种方法中,我得到了在控制台中打印的值,但它们没有返回。

屏幕截图如下:Console Log

我不知道我哪里错了,有人可以建议我。

已编辑:已添加模板代码:

    <tr>
        <td>Local Time:</td>

        <td><input id="company_location_time" name="company_location_time" type="text" size="23" placeholder="Lead Company Location Time" value="{{getLocationTimebyAPI company_location}}" readonly style="background:#7FAAFF;font-weight:bold;"><p style="font-size:8px;">Local Time Powered By <a style="font-size:8px;" href="http://www.worldweatheronline.com/search-weather.aspx?q={{company_location}}"  target="_blank">World Weather Online</a></p></td>
    </tr>

2 个答案:

答案 0 :(得分:1)

docs所说的,你可以省略异步回调,它将同步运行。所以这应该在服务器上运行:

'getLocationTimebyAPIServerMethod': function(company_location){
    // do checks
    var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=XXXXXX';
    var result = HTTP.get( apiurl );
    return result;
}

在客户端上,模板助手应返回undefined,因为在调用助手时,还没有返回值。并且助手中没有反应性数据源会导致模板重新渲染。因此,要么使用reactive-var存储结果,要么使用来自stubailo meteor-reactive-method的此包。

如果能解决您的问题,请告诉我们!

答案 1 :(得分:0)

我使用了@tomsp上面提到的方法:

首先添加https://atmospherejs.com/simple/reactive-method

meteor add simple:reactive-method

然后更改了我的代码

服务器端方法

'getLocationTimebyAPIServerMethod': function(company_location){
    // do checks
    var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=50a151065dc2a4ea69c1b93032805';
    var result = HTTP.get( apiurl );

      var localtime = result.data.data.time_zone[0].localtime
      var utcoffset = result.data.data.time_zone[0].utcOffset
      var returntext = localtime+' (UTC '+utcoffset+')';
      return returntext;
}

客户端助手功能

  getLocationTimebyAPI: function (company_location) {
    return ReactiveMethod.call("getLocationTimebyAPIServerMethod", company_location);

}

结果显示在下面的屏幕截图中:

enter image description here