我是Meteor的新手,我试图从Heroku API获取异步数据。
服务器端代码:
heroku = Meteor.require("heroku");
Meteor.methods({
'getHeroku': function getHeroku(app){
client = new heroku.Heroku({key: "xxxxxx"});
client.get_app(app, function (error, result) {
return result;
});
}
});
客户端代码:
Template.herokuDashboard.helpers({
appInfo: function() {
Meteor.call('getHeroku', "meathook-api", function (error, result) {
console.warn(result);
} );
}
});
Heroku需要一段时间才能回答,所以答案是undefined
。
那么捕获异步结果的最佳方法是什么?
谢谢。
答案 0 :(得分:13)
if (Meteor.isClient) {
Template.herokuDashboard.helpers({
appInfo: function() {
return Session.get("herokuDashboard_appInfo");
}
});
Template.herokuDashboard.created = function(){
Meteor.call('getData', function (error, result) {
Session.set("herokuDashboard_appInfo",result);
} );
}
}
无法直接从Meteor.call返回结果。 但是至少有两种解决方案(@akshat和@Hubert OG): How to use Meteor methods inside of a template helper
使用Meteor._wrapAsync:
if (Meteor.isServer) {
var asyncFunc = function(callback){
setTimeout(function(){
// callback(error, result);
// success :
callback(null,"result");
// failure:
// callback(new Error("error"));
},2000)
}
var syncFunc = Meteor._wrapAsync(asyncFunc);
Meteor.methods({
'getData': function(){
var result;
try{
result = syncFunc();
}catch(e){
console.log("getData method returned error : " + e);
}finally{
return result;
}
}
});
}
正确使用Future库:
if (Meteor.isServer) {
Future = Npm.require('fibers/future');
Meteor.methods({
'getData': function() {
var fut = new Future();
setTimeout(
Meteor.bindEnvironment(
function() {
fut.return("test");
},
function(exception) {
console.log("Exception : ", exception);
fut.throw(new Error("Async function throw exception"));
}
),
1000
)
return fut.wait();
}
});
}
使用未来库没有Meteor.bindEnvironment 未推荐,请参阅: