0

我的情况大致是这样的:我需要创建一个“聊天流”,用户还可以在其中添加自封装的子模块,这些子模块有自己独特的、私人的沟通渠道。换句话说,用户正在聊天中聊天,用户 #1 点击“添加模块”按钮,生成 uuid 并在“newModule”消息中发布到 PubNub 聊天频道,该频道上的所有听众都会收到带有 uuid 的消息,然后继续创建模块的本地副本,该模块本身订阅 PubNub 频道“uuid”。模块出现在聊天流中,用户可以继续聊天,还可以在他们自己的“uuid”PubNub 频道上从链接的私有模块来回发送(假设)“点击”。

不幸的是,当新模块尝试订阅新频道时,PubNub 会“重新触发”聊天频道上收到的最后一个事件,从而触发创建第二个重复模块。

我在这里创建了一个简化的测试用例来演示问题行为:http: //codepen.io/teolitto/pen/09f75b8b60f69a1c3aaab85af01b3cd3 ?editors=1000

DOM 和标签定义:

<AppMain></AppMain>

<script type="riot/tag">
  <AppMain>
    <h3>AppMain</h3>
    <button onclick={ publishNewColorBox }>
     New ColorBox
    </button>

    //logic
    var context = this;
    context.eventBus = appCore.eventBus;

    context.publishNewColorBox = function() {
      console.log('1. "New ColorBox" button click handler')
      PN.publish({
        channel: appCore.channel,
        message: {
          type: "newColorBox",
          boxId: PN.uuid()
        }
      })
    }

    context.addNewColorBox = function(boxId){
      var cb = document.createElement('ColorBox');
      context.root.appendChild(cb);
      riot.mount(cb, {boxId: boxId});
    }

    context.init = function(){
      context.eventBus.on('addNewColorBox', function(boxId){
        console.log('3. riot "addNewColorBox" event received by application, mounting new ColorBox');
        context.addNewColorBox(boxId);
      })
    }

    context.on('mount', function(){
      context.init();
    })
  </AppMain>

  <ColorBox>
    <div></div>

    //logic
    var context = this;
    context.eventBus = riot.observable();
    context.boxId = opts.boxId;
    context.init=function(){
      console.log('4. ColorBox successfully mounted, subscribing PN to channel ',context.boxId);
      PN.subscribe({
        //channel: 'someChannel',
        channel: context.boxId,
        message: function(m){
          console.log('box channel received message:',m);
        }
      });
    }

    context.on('mount', function(){
      context.init();
    })
  </ColorBox>
</script>

Javascript:

$(function(){

  appCore = {
    channel: "firstChannel",
    eventBus: riot.observable()
  }

  PN = PUBNUB.init({
      publish_key: 'pub-c-92c890df-0f01-4f9b-9084-ec118f452dc9',
      subscribe_key: 'sub-c-e8889318-c702-11e5-837e-02ee2ddab7fe'
    });


  PN.subscribe({
    channel: appCore.channel,
    message: function(m){
      switch(m.type) {
        case "newColorBox":
          console.log('2. PN channel', appCore.channel, ' received "newColorBox" message. Firing riot event "addNewColorBox"')
          appCore.eventBus.trigger('addNewColorBox', m.boxId);
          break;
      }
    }
  });


riot.mount('AppMain');

});

我确实在 PubNub 控制台中打开了 muxing('流控制器'),所以不是这样。

我发现了有助于改善问题的技巧——在订阅新频道之前设置大约 33 毫秒的超时时间似乎可以解决问题。如果订阅的频道是最近访问过的频道,则不会出现问题。但是,由于我每次都需要一个新的、独特的频道,而且我真的更愿意避免像超时这样的骇人听闻的解决方案(天知道如果我必须这样做我还会遇到什么),我在问这里。有任何想法吗?这可能是 PubNub 中的错误吗?还是我的实施镜头?

非常感谢任何输入。

4

0 回答 0