我使用Crossbar作为WAMP路由器并发布订阅并在网页前端呈现的事件。
从前端开始,我首先打电话告诉后端开始发布信息。然后我订阅了这个主题。
编辑这里的想法是我想从后端发布信息以查看前端,但不需要一直发布它。因此,当页面加载时,我想发送一条消息告诉它开始发布,然后在不再需要时停止它。
这是前端代码的相关部分。
function connect() {
var connection = new autobahn.Connection(
{
url: "ws://com.example.wamp:8765/ws",
realm: "info"
});
connection.onopen = function (session) {
// ...
session.call("com.example.startPublish");
// ...
session.subscribe("com.example.info", onInfo);
// ...
};
connection.onclose = function (reason, details) {
// ...
session.unsubscribe("com.example.info");
// ...
};
connection.open();
}
$(function() {
connect();
});
function onInfo(args, kwargs) {
$(".info").text(kwargs.info);
}
在后端我做了一些处理来获取信息并发布它。这是后端代码:
var publishInfoInterval = null;
var session;
var connection = new autobahn.Connection(
{
url: "ws://com.example.wamp:8765/ws",
realm: "info"
});
function getInfo() {
// ...
return duration;
}
function publishInfo() {
publishInfoInterval = setInterval(function() {
session.publish("com.example.info", [], {
"info": getInfo(),
});
}, 10000);
}
function startPublish() {
publishInfo();
}
function stopPublish() {
clearIntervals();
}
function clearIntervals() {
if(publishInfoInterval) {
clearInterval(publishInfoInterval);
publishInfoInterval = null;
}
}
connection.onopen = function(sess) {
session = sess;
sess.register("com.example.startPublish", startPublish).then(
function() {
console.log("Registered startPublish");
}
);
sess.register("com.example.stopPublish", stopPublish).then(
function() {
console.log("Registered stopPublish");
}
);
};
connection.onclose = function(reason, details) {
clearIntervals();
};
connection.open();
我遇到的问题是,当我刷新页面时,它会创建一个新的订阅。但原始订阅仍然发布相同的信息。所以在刷新页面之后,我已经双重订阅了。
我想知道处理这个问题的最佳方法是什么。