流星助手什么都不返回

时间:2016-11-20 11:53:17

标签: meteor

我想为返回字符串数据创建帮助器:

  className() {

    let className;

    Meteor.call('getIp', (err, res) => {

      if (err) {
        console.log(err);
      } else {

        // User ip
        let ip = res.data.ip;
        let userLikers = this.likers;

        // Si l'utilisateur a déjà aimé le post
        if (userLikers.includes(ip)) {
          className = 'icon-favorite';
        } else {
          className = 'icon-favorite-border';
        }

        console.log(className);

        return className;

      }
    });

  }

我的console.log(className)很好,我不明白为什么我的返回是空的。

有人有想法吗?

谢谢!

4 个答案:

答案 0 :(得分:0)

Meteor.call()在客户端异步运行。与所有异步函数一样,它们使用回调函数。在您的情况下,这是代码的(err, res) => { ... }部分。

这意味着return className;回调函数的返回值。但是,Meteor.call()调用之前或之后的代码使用另一个范围。所以基本上classname()函数不会返回任何内容,因为该函数没有return语句。

您可能想要的是将回调内部的数据分配给在回调调用之前声明的另一个变量。例如。

之类的东西
//Just for illustration.
//Do NOT use it, as it will not work an will not do what you might think it does.
className() {

    let value;

    Meteor.call('getIp', (err, res) => {
      //do other stuff like error handling
      // and getting the value here ...

      console.log(className);
      value = className;
    });

    return value;
}

然而,这仍然不能解释异步性。函数很可能会在回调被触发之前返回。在这种情况下,您仍然会得到一个空的返回值。为避免这种情况,请尝试使用Meteor.wrapAsync()Meteor.call()包装在其中。这样就可以得到异步函数调用的返回值。

答案 1 :(得分:0)

这里要记住的是服务器和客户端在不同的地方运行,一个在服务器上,一个在浏览器中。 Meteor使这种差异变得不那么明显,并且使得传递数据在很大程度上是无缝的。

我使用的技术是获取服务器方法将结果插入到mongo集合中。客户端上的帮助程序将自动运行,客户端可以在到达时显示它。

答案 2 :(得分:0)

正如其他答案所指出的那样,在辅助函数中使用Meteor Methods(或其他异步代码)(即渲染时)不会起作用。助手无法阻止,因此无法等待服务器的结果。

然而,看看你想要做什么,可能会有更好的解决方案。您的客户端代码询问服务器它的(客户端)IP地址是什么,以便您可以选择适当的css类。

我建议您查看Meteor的优秀帐户包 - 它非常易于使用,并将为您提供识别用户的强大方法。

如果您希望在不要求用户登录的情况下提供此个性化,我建议您在客户端上存储持久性ID(即使用random模块生成,存储在localStorage中,或通过persistent-session)或类似的),或者只是在客户端上存储该用户喜欢的项目列表(帖子?)。

这也避免了这样的事实:除非您的用户拥有静态IP地址,否则这些地址会经常更改。

答案 3 :(得分:0)

您可以尝试使用会话。加载模板时,调用方法并在回调中为会话分配返回值。在帮助程序中,您可以使用该会话返回有效数据,因为在开始会话中将是未定义的,但是当它在回调中设置时,帮助程序将自动重新运行,会话将返回有效值。希望这可以帮助您解决问题:)