42

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

/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。

谢谢!

4

4 回答 4

78

文档Meteor.call

在客户端,如果你不传递回调并且你不在存根中,调用将返回 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;
};

一旦数据可用,这将响应式更新模板。

于 2012-05-20T21:58:34.083 回答
1

发生这种情况是因为Npm.require具有异步行为。这就是你必须为Meteor.call.

但是有一个解决方案,只要使用install(mrt add npm),你就会得到一个以此命名的函数Meteor.sync(//...),你可以同时做这两种游戏:同步和异步在你的Meteor.call().

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

于 2013-12-02T20:50:32.393 回答
0

您可以通过使用反应变量来获取 Meteor 方法的返回值以在模板中使用。查看Meteorpad 上的工作演示

于 2015-06-24T13:13:01.097 回答
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");
}
于 2016-01-21T00:30:08.253 回答