所以我一直在做一些阅读,我认为我对这个主题有一般的把握,但可以使用更有经验的人的一些见解。我一直在尝试在Meteor中编写一个简单的RSS阅读器,并且一直面临着异步调用Meteor方法的一些问题。我目前在服务器上定义该方法(同步)并在客户端上调用它(异步)。我不明白的是,当我尝试在服务器上创建HTTP.call时,如果我将回调传递给请求,则返回传递给我的客户端的未定义值。但是当我同步地发出API请求时,一切似乎都能正常工作。这是我应该期望的正常行为/我应该进行API调用的方式吗?
Meteor.methods({
getSubReddit(subreddit) {
this.unblock();
const url = 'http://www.reddit.com/r/' + subreddit + '/.rss';
const response = HTTP.get(url, {}, (err, res) => {
if(!err) {
//console.log(res.content);
return res;
} else {
return err;
}
});
}
});
这是服务器端定义的方法。请注意,记录res.content表明我实际上从通话中获得了正确的内容。我已经尝试阅读关于该主题的其他一些答案,并看到了一些关于使用Future / wrapAsync的事情,但我不确定我是否得到它。任何帮助将不胜感激!
答案 0 :(得分:0)
HTTP.get
正在执行异步工作,因此传递给它的回调将从此流星方法调用上下文中调用。
为了获得理想的结果,你应该这样做:
Meteor.methods({
getSubReddit(subreddit) {
// IMPORTANT: unblock methods call queue
this.unblock();
const url = 'http://www.reddit.com/r/' + subreddit + '/.rss';
const httpGetSync = Meteor.wrapAsync(HTTP.get);
try {
const response = httpGetSync(url, {});
//console.log(response.content);
return response.content;
} catch (err) {
// pass error to client
throw new Meteor.Error(...);
}
}
});