如何让Meteor.Call返回模板的值?

我试图理解这个概念 ,但是,我没有得到它。 我有以下简单的设置:

/server/test.js Meteor.methods({ abc: function() { var result = {}; result.foo = "Hello "; result.bar = "World!"; return result; } }); /client/myapp.js var q = Meteor.call('abc'); console.log(q); 

这个结构返回到undefined的控制台。

如果我将myapp.js文件更改为:

 Meteor.call('abc', function(err, data) { !err ? console.log(data) : console.log(err); } 

我收到我的控制台中的Object

理想情况下,这是我希望能够做的,但它不起作用,在控制台中说: Cannot read property 'greeting' of undefined

 /client/myapp.js var q = Meteor.call('abc'); Template.hello.greeting = function() { return q.foo; } 

任何帮助将数据从服务器对象传递到模板将不胜感激。 我还在学习JavaScript和Meteor。

谢谢!

Meteor.call文档 :

在客户端,如果你没有传递一个callback,而你又不在一个存根内,那么调用将返回undefined,你将无法获得该方法的返回值。 这是因为客户端没有光纤,所以实际上没有任何方法可以阻止方法的远程执行。

所以,你会想这样做:

 Meteor.call('abc', function(err, data) { if (err) console.log(err); Session.set('q', data); }); Template.hello.greeting = function() { return Session.get('q').foo; }; 

一旦数据可用,这将会被动更新模板。

发生这种情况是因为Npm.require具有asynchronous行为。 这就是你必须为Meteor.call写一个callback的Meteor.call

但是有一个解决scheme,只需使用install(mrt add npm) ,你将得到一个名为Meteor.sync(//...)的函数,你可以在Meteor.call()

参考: http : //www.sitepoint.com/create-a-meteor-app-using-npm-module/

您可以通过使用无功variables来获取Meteor方法在模板中使用的返回值。 检查Meteorpad上的工作演示

我去了贫民窟解决scheme。 但是,这对我来说很重要,这对我来说很重要。 下面是我的代码,我认为这个代码解决了OP的问题。

在客户端的main.js中:

 Meteor.setInterval(function() { confirmLogin(); }, 5000); 

这将每五秒运行一次confirmLogin()函数。

confirmLogin函数(在客户端的main.js中):

 function confirmLogin() { Meteor.call('loggedIn', function (error, result) { Session.set("loggedIn", result); }); } 

loggedIn方法(在服务器的main.js中):

 loggedIn: function () { var toReturn = false; var userDetails = Meteor.user(); if (typeof userDetails["services"] !== "undefined") { if (typeof userDetails["services"]["facebook"] != "undefined") { toReturn = true; } } return toReturn; }, 

相关的帮手:

 loggedIn: function () { return Session.get("loggedIn"); }