在Firefox和IE上使用Meteor.user()问题的Deps.autorun

时间:2013-11-20 23:47:35

标签: javascript meteor

所以我这里有这个代码用于自动订阅当前的玩家游戏

Deps.autorun ->
  Meteor.subscribe "game", Meteor.user().profile.game

但它只适用于谷歌浏览器。 firefox和IE都显示错误,说明Meteor.user(...)未定义。

请注意,当我直接在控制台中输入Meteor.user().profile.game时,它会很好地返回当前游戏ID。显然,问题仅在于上述代码出于某种原因。另外,依赖于Session的其他Deps.autorun函数也可以正常工作。 感谢。

1 个答案:

答案 0 :(得分:4)

这是竞争条件。您假设用户已在autorun执行时登录。如果他/她不是,则Meteor.user()将返回null。一种解决方案是使用浸泡:

Tracker.autorun ->
  Meteor.subscribe 'game', Meteor.user()?.profile.game

但是发布函数知道哪个用户试图订阅,所以我认为更好的解决方案是这样的:

Tracker.autorun ->
  if Meteor.user()
    Meteor.subscribe 'game'

请注意,Meteor.user()中的autorun检查会在用户登录时强制重新运行(这也是出于性能原因)。然后在服务器上执行:

Meteor.publish 'game', ->
  user = Meteor.users.findOne @userId
  {game} = user.profile
  Games.find game