需要澄清有关异步调用 Meteor 方法的说明



所以我一直在做一些阅读,我认为我对这个主题有一个大致的了解,但可以从更有经验的人那里获得一些见解。我一直在尝试在 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的一些内容,但我不确定我是否理解它。任何帮助将不胜感激!

HTTP.get正在执行异步工作,因此传递给它的回调将从此 meteor 方法调用上下文中调用。

要获得所需的结果,您应该这样做:

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(...);
}
}
});

最新更新