需要澄清异步调用Meteor方法

时间:2017-08-15 21:30:13

标签: javascript http asynchronous 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的事情,但我不确定我是否得到它。任何帮助将不胜感激!

1 个答案:

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