返回的方法调用是不确定的?

好的,所以我正在使用一个方法来发出请求,并从另一个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); } }); 

想法?

你需要在这里理解两个不同的东西:

  • 在客户端,对服务器进行一些调用总是asynchronous的,因为我们必须处理networking延迟。 这就是为什么我们使用callback来获取Meteor方法的结果:这个代码将来会执行一段时间,而不是马上。

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

  • 与模板帮助程序相反,事件处理程序不是被动的,所以这意味着当您将Sessionvariables设置为方法的结果时,事件处理程序代码不会使用Session.get('gogle')的新值自动重新执行。

您需要在Meteor方法callback中使用结果,或者根据Session.get('gogle')使用响应式计算(模板助手或Tracker.autorun),以便在响应数据源被修改时重新运行,并使用从服务器获取并分配给Sessionvariables的新值。

快速更新..能够解决这个只有一行代码哈哈。

而不是request(url, function(err, response, body)我用froatsnook:请求包和使用var result = request.getSync(url, {encoding: null});然后只是取代$ = cheerio.load(body);$ = cheerio.load(result.body);