2015-05-06 36 views
1

好了,所以我使用的方法提出要求,并从另一个URL返回的方法调用未定义?

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

拉一些表调用时在表中TD的成功地打印到服务器控制台:http://prntscr.com/721pjh

Buuut,当文本是从该方法此客户机代码返回,undefined被打印到控制台:

Template.title.events({ 
    'click #thebutton': function() { 
     Meteor.call('gimmetitle', function(error, result){ 
      Session.set('gogle', result); 
     }); 

     var avar = Session.get('gogle'); 
     console.log(avar); 
    } 
}); 

想法?

+0

我建议你直接在代码标签内发布你的代码,这样它更容易使用/提琴而不是只发布屏幕截图。 –

+0

@RushyPanchal添加了粘贴。 – Orbit

+0

你应该将你的代码直接粘贴到问题中,而不是链接到别处。如果有人想要帮助,那么他们是否必须加倍努力去其他地方,这是令人沮丧的。我现在这样做了,但我也建议复制输出并粘贴它,而不是使用图像。只是一个提示:) –

回答

1

您需要了解这里两个不同的东西:

  • 在客户端,使得一些调用服务器始终是异步的,因为我们要应付网络延迟。这就是为什么我们使用回调来获取Meteor方法的结果:这个代码将来会执行一段时间,而不是马上。

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

  • 相反,模板助手,事件处理程序都没有反应,所以这意味着,当你的Session变量设置为方法的结果,事件处理程序代码不会自动与Session.get('gogle')新值重新执行。

你需要正确的方法流星回调要么做一些事情的结果,或使用反应计算(模板助手或Tracker.autorun)根据Session.get('gogle')每当反应数据源被修改,以重新运行,并使用从服务器获取并分配给Session变量的新值。

+0

谢谢。下面是一个想法...而不是使用会话,而是尝试通过'console.log(result);'在setTimeout'函数内打印结果几秒钟后,为什么这不起作用?很明显,电话会在那个时候完成? – Orbit

+0

这将是可怕的设计,并在某些情况下引入微妙的错误(高网络延迟,服务器错误等)。使用Meteor方法回调来检测服务器响应,永远不会超时。 – saimeunt

+0

但理论上不应该这样工作? – Orbit

0

快速更新..能用一行代码修复这个问题。

代替request(url, function(err, response, body)我使用的froatsnook:request包和用于var result = request.getSync(url, {encoding: null});然后刚更换$ = cheerio.load(body);$ = cheerio.load(result.body);

相关问题