我已经尝试了to understand this post regarding this concept,但是,我没有得到它。我有以下简单的设置:
/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&流星。
谢谢!
答案 0 :(得分:77)
来自the Meteor.call
documentation:
在客户端上,如果你没有传递回调并且你不在存根中,则调用将返回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;
};
一旦数据可用,这将反应性地更新模板。
答案 1 :(得分:1)
这是因为Npm.require
具有异步行为。这就是你必须为Meteor.call
编写回调的原因。
但是有一个解决方案,只需使用install(mrt add npm)
,您将获得一个名为Meteor.sync(//...)
的函数,您可以同时执行这两项游戏:Meteor.call()
中的同步和异步。
参考:http://www.sitepoint.com/create-a-meteor-app-using-npm-module/
答案 2 :(得分:0)
您可以使用reactive variable获取Meteor方法的返回值,以便在模板中使用。查看working demonstration on Meteorpad
答案 3 :(得分:0)
我去了一个贫民区解决方案。但是,它对我来说很重要,这对我来说很重要。下面是我的代码,在概念上,我认为,它解决了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");
}