我的情况大致是这样的:我需要创建一个“聊天流”,用户还可以在其中添加自封装的子模块,这些子模块有自己独特的、私人的沟通渠道。换句话说,用户正在聊天中聊天,用户 #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 中的错误吗?还是我的实施镜头?
非常感谢任何输入。