取消订阅socket.io

时间:2016-04-27 13:22:16

标签: javascript angularjs websocket socket.io sails.js

我们说我有一个带有10行的表格的角度页面,每行都有一个id,并将我重定向到一个具有唯一ID的页面。

我想在socket.io中订阅此id,当我将此页面/更改为另一个时,我想将之前的订阅替换为新订阅。

我该怎么做?我是否必须将所有当前订阅保存在数据库中?

(我在节点上使用sails.js框架,在客户端使用angular)。

1 个答案:

答案 0 :(得分:0)

当您断开套接字(即将页面更改为另一个)时,socket.io会自动取消您的套接字。

要订阅房间,您只需在连接ID时从角度发送消息,然后在您的sails控制器中为用户订阅ID

修改

this页所述,您需要实施系统来跟踪套接字。

首先,在/ api / services /中创建一个服务并将其放入:

module.exports = {

    switchRoom: function (socket, to_id) {
        var tmp = _.find(sails.mysubscribers, function (sub) {
            return sub.socket === socket;
        });
        if (tmp) { // If user came from another page unsuscribe him
            sails.sockets.leave(socket, 'Unique prefix' + tmp.roomId);
        } else {
            tmp = {
                socket: socket
            };
            sails.mysubscribers.push(tmp);
        }

        if (!to_id) { // If the user leave remove him from the array
            var index = sails.mysubscribers.indexOf(tmp);
            if (index > -1) sails.mysubscribers.splice(index, 1);
        } else {
            tmp.roomId = to_id;
            sails.sockets.join(socket, 'Unique prefix' + to_id);
        }
    }
};

然后,在/config/sockets.js中编辑afterDisconnect函数:

module.exports.sockets = {

    afterDisconnect: function (session, socket, cb) {
        YourService.switchRoom(socket);
        return cb();
    }
};

现在,当你需要switchRoom时,你只需要调用YourService.switchRoom(req.socket, roomId),其中roomId是由angular发送的id ...

那就是它!