2016-11-20 50 views
0

我想创建一个返回字符串数据助手:流星助手返回任何

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(类名)是很好的,我不明白为什么我的回报是空的。

任何人有想法吗?

谢谢!

回答

0

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

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

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

//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()包装在其中。这样你可以获得异步函数调用的返回值。

+0

异步包装将无法在客户端(这是代码可能运行的地方)工作。我没有意识到在Blaze助手中使用异步代码的优雅方式,除了有被动数据源。电话不是其中的一个来源。 – MasterAM

+0

是的,异步包装在客户端上不起作用。但我如何检查我的数据? –

+0

您解释了基本问题,这很好,但我认为发布无法可靠工作的代码并不是一个好主意 - 因此它不是解决问题的办法。 – Mikkel

0

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

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

0

正如其他答案指出的那样,在助手函数(即渲染)中使用流星方法(或其他异步代码)不会奏效。助手不能阻塞,所以不能等待服务器的结果。

然而,看看你正在尝试做什么,有可能会有更好的解决方案。你的客户端代码询问服务器是什么(客户端)的IP地址,以便你可以选择合适的CSS类。

我建议你看看流星的优秀账户包 - 这是非常容易的工作,并将为您提供一个强大的方式来识别用户。

如果你想在不需要用户登录的情况下提供此个性化,我建议你在客户端存储一个持久性ID(即用random模块生成,存储在localStorage中,或者通过persistent-session或类似的方式生成)或者直接在客户端上存储该用户喜欢的项目列表(文章?)。

这也避免了这样一个事实,除非你的用户有静态IP地址,这些会经常改变。

0

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