0

我使用 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();

我遇到的问题是,当我刷新页面时,它会创建一个新订阅。但原始订阅仍在发布相同的信息。所以刷新页面后,我双重订阅。

我想知道处理这个问题的最佳方法是什么。

4

0 回答 0