1

我正在开发一个基于流星和 MeteorStreams 的简单应用程序。目的很简单:一个用户将单击一个按钮来创建一个房间,其他用户将加入该房间这些用户可以发出带有简单消息的流,创建者将听取该消息然后显示它们

事实上:来自其他用户的消息已发送(登录服务器脚本),但创建者没有收到它们。如果我重新加载创建者的页面,那么它将收到其他用户发送的消息。

我真的不明白为什么它第一次不起作用。

我为我的路由系统使用meteor-router。代码可以在这里看到

https://github.com/Rebolon/MeetingTimeCost/tree/feature/pokerVoteProtection

客户端代码在 client/views/poker/* 中可用,服务器流代码的客户端/助手在 server/pokerStreams.js 中

应用程序可以在这里测试:http: //meetingtimecost.meteor.com 创建者必须登录。

如果您有任何想法,欢迎提供任何帮助。谢谢

4

1 回答 1

2

好的,好的,在做了一些调试之后,我现在明白了我的代码有什么问题:事实上这很容易。问题来自我忘记将 Stream.on 事件绑定到 Deps.autorun 的事实。结果是这部分代码不是由反应性管理的,因此当 Session 更改时它永远不会自动重新运行。

使用 Meteor 解决方案非常简单:只需将这部分代码包装在 Deps.autorun 中

Meteor.startup(function () {
  Deps.autorun(function funcReloadStreamListeningOnNewRoom () {
    PokerStream.on(Session.get('currentRoom') + ':currentRoom:vote', function (vote) {
      var voteFound = 0;
      // update is now allowed
      if (Session.get('pokerVoteStatus') === 'voting') {
        voteFound = Vote.find({subscriptionId: this.subscriptionId});
        if (!voteFound.count()) {
          Vote.insert({value: vote, userId: this.userId, subscriptionId: this.subscriptionId});
        } else {
          Vote.update({_id: voteFound._id}, {$set: {value: vote}});
        }
      }
    });
  });
});

所以这不是 Meteor Streams 的问题,而只是我的错。希望它能帮助人们理解在模板和集合之外,如果你想要反应性,你需要将你的代码包装在 Deps 中。

于 2013-08-02T07:05:19.010 回答