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

时间:2012-05-20 21:45:16

标签: callback meteor

我已经尝试了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&流星。

谢谢!

4 个答案:

答案 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");
}