我试过了 了解这篇文章关于这个概念, 但是,我没有得到它。我有以下简单的设置:

/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.call文档

在客户端上,如果您未通过回调并且您不在存根内,则调用将返回未定义,并且您将无法获得方法的返回值。这是因为客户端没有纤维,所以它实际上没有任何方式可以阻止对方法的远程执行。

所以,你想要这样做:

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 具有异步行为。这就是你必须编写回调的原因 Meteor.call.

但是有一个解决方案,只需使用 install(mrt add npm) 你会得到一个名为 Meteor.sync(//...) 有了这个,你可以做两个游戏:同步和异步在您的 Meteor.call().

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

我去了贫民区解决方案。但是,它适合我,这是对我来说重要的。下面是我的代码,在概念中,我认为,解决了OP的问题。

在客户端的main.js中:

Meteor.setInterval(function() {
    confirmLogin();

}, 5000); 
.

这五秒钟运行Confionlogin()函数。

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

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

}
.

logggein方法(在服务器的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");
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top