Meteor wrapAsync / Node Fiber Future 不工作
Meteor wrapAsync / Node Fiber Future Not working
我正在尝试使用 Meteor Method 从一个 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;
}
方法二:使用 Node Fiber Future- 服务器端
'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();
}
在这两种方法中,我都在控制台中打印了值,但没有返回它们。
以下为截图:
我不知道我哪里错了,谁能给我一些建议。
已编辑:添加模板代码:
<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>
根据 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;
}
在客户端,模板助手应该 return undefined
因为调用助手时还没有 return 值。并且助手中没有会导致模板重新呈现的反应性数据源。因此,要么使用 reactive-var
来存储您的结果,要么使用来自 stubailo meteor-reactive-method.
的这个包
如果这能解决您的问题,请告诉我!
我用过上面@tomsp说的方法:
第一次添加https://atmospherejs.com/simple/reactive-method
流星添加simple:reactive-方法
然后更改了我的代码
服务器端方法
'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);
}
结果如下图所示:
我正在尝试使用 Meteor Method 从一个 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;
}
方法二:使用 Node Fiber Future- 服务器端
'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();
}
在这两种方法中,我都在控制台中打印了值,但没有返回它们。
以下为截图:
我不知道我哪里错了,谁能给我一些建议。
已编辑:添加模板代码:
<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>
根据 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;
}
在客户端,模板助手应该 return undefined
因为调用助手时还没有 return 值。并且助手中没有会导致模板重新呈现的反应性数据源。因此,要么使用 reactive-var
来存储您的结果,要么使用来自 stubailo meteor-reactive-method.
如果这能解决您的问题,请告诉我!
我用过上面@tomsp说的方法:
第一次添加https://atmospherejs.com/simple/reactive-method
流星添加simple:reactive-方法
然后更改了我的代码
服务器端方法
'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);
}
结果如下图所示: