返回的方法调用未定义?

时间:2015-05-06 02:34:27

标签: node.js meteor

好吧我正在使用一种方法来发出请求并从另一个URL中提取一些表

$ sort -n dat/twenty.txt | uniq -c
      3 1
      3 2
      3 3
      4 4
      4 5
      4 6
      4 7
      4 8
      4 9
      4 10
      4 11
      3 12
      2 13
      2 14
      4 15
      4 16
      4 17
      2 18
      2 19
      2 20

当调用表中的td成功打印到服务器控制台时:http://prntscr.com/721pjh

Buuut,当该文本从该方法返回到此客户端代码时,Meteor.methods({ gimmetitle: function () { var url = 'http://wiki.warthunder.com/index.php?title=B-17G_Flying_Fortress'; request(url, function(err, response, body) { $ = cheerio.load(body); var text = $('.flight-parameters td').text(); console.log(text); return text; }); } }); 将打印到控制台:

undefined

想法?

2 个答案:

答案 0 :(得分:1)

您需要了解两件不同的事情:

  • 在客户端,对服务器进行一些调用始终是异步的,因为我们必须处理网络延迟。这就是为什么我们使用回调来获取Meteor方法的结果:这段代码将在未来的某个时间执行,而不是立即执行。

这就是Session.set('gogle', result);var avar = Session.get('gogle');之后实际执行的原因,即使它出现在事件处理程序代码流之前。

  • 与模板助手相反,事件处理程序不是被动的,因此这意味着当您将Session变量设置为方法的结果时,不会使用新值{{自动重新执行事件处理程序代码1}}。

您需要在Meteor方法回调中对结果执行某些操作,或者根据Session.get('gogle')使用反应计算(模板帮助程序或Tracker.autorun),以便在响应数据源时重新运行已修改,并使用从服务器获取的新值并分配给Session.get('gogle')变量。

答案 1 :(得分:0)

快速更新..只需1行代码即可修复此问题。

而不是request(url, function(err, response, body)我使用froatsnook:request包并使用了var result = request.getSync(url, {encoding: null});,然后将$ = cheerio.load(body);替换为$ = cheerio.load(result.body);