0

私の状況はおおよそ次のとおりです。「チャット フロー」を作成する必要があります。このフローには、ユーザーが通信するための独自のプライベート チャネルを持つ自己カプセル化されたサブモジュールを追加することもできます。つまり、ユーザーがチャットでチャットしているときに、ユーザー #1 が「モジュールの追加」ボタンを押すと、uuid が生成され、「newModule」メッセージで PubNub チ​​ャット チャネルに公開され、そのチャネルのすべてのリスナーが uuid を持つメッセージを受信します。 、モジュールのローカル コピーの作成に進みます。このコピー自体は、PubNub チ​​ャネル「uuid」にサブスクライブします。モジュールはチャット フローに表示されます。ユーザーはチャットを続けることができますが、自分の「uuid」PubNub チ​​ャネルでリンクされたプライベート モジュールから「クリック」を送受信することもできます。

残念ながら、新しいモジュールが新しいチャンネルを購読しようとすると、PubNub はチャット チャンネルで受信した最後のイベントを「再起動」し、2 つ目の重複したモジュールの作成をトリガーします。

ここで問題の動作を示す簡素化されたテスト ケースを作成しました。

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 コンソールで多重化 (「ストリーム コントローラー」) をオンにしているので、そうではありません。

問題を改善するのに役立つハックを見つけました.新しいチャンネルにサブスクライブする前に約33ミリ秒のタイムアウトを設定すると、問題が解決するようです. 購読しているチャンネルが最近アクセスしたものである場合、問題は発生しません。ただし、毎回新しい一意のチャネルが必要であり、タイムアウトのようなハックな解決策を避けたいと思っているため (そうしなければならない場合、他に何に遭遇するかは神のみぞ知る)、私は尋ねています。ここ。何か案は?これは PubNub のバグでしょうか? それとも私の実装は撃たれていますか?

どんな入力でも大歓迎です。

4

0 に答える 0