如何通知其他用户某个模态是打开的

时间:2017-05-08 16:08:14

标签: javascript mongodb sockets meteor socket.io

考虑到这种情况:

用户(客户代理)应该知道该模式当前是否由其他客户支持打开,以避免处理数据时出现冲突。所以我打开模态的例子,它应该通知其他用户"嘿,现在正在处理这个,去做其他事情"

由于该项目正在使用meteor.js,我考虑利用其实时功能。我想在每个模态上存储(MongoDB)一个状态,如果它是开放的(因为每个模态都是一个数据),当然我们可以设置"关闭状态"如果用户关闭模态(如果他没有继续处理数据),那么如果用户意外关闭浏览器选项卡/浏览器窗口/断电怎么办?然后将数据设置为"打开"永远在数据库中。

我还考虑过使用套接字。 (即socketIO)所以它会向每个用户打开模态时打开的当前模态的数据发布给其他用户,因此用户打开了一个模态 - >套接字通知其他用户打开的模态。但是如果用户打开一个模态怎么办 - >套接字通知其他用户 - >然后另一个用户登录到系统(这意味着他没有得到套接字通知,并可能最终打开相同的模式。

那么你想分享哪些推荐/想法/提示?

我使用Meteor.js,React js,MongoDB作为我的数据库。

1 个答案:

答案 0 :(得分:1)

您可以通过socket.io实现您所寻求的目标。通过在服务器中创建Map(),您将如何处理通知其他用户的示例。它包含有关当前打开的模态和访问它们的用户的信息。我已经概述了下面的一些代码,可以提供给您并了解如何操作:

//client side
function modals(socket) {

    this.sendModalOpen = (modalIdentifier) => {

        socket.emit('openedModal', {
            modal: modalIdentifier
        });
    };

    this.closeModal = () => {
        socket.emit('closedModal', {
            modal: modalIdentifier
        });
    };

}


socket.on('recModalInfo', (data) => {
    for (let x = 0; x < data.info.length; x++) {
        console.log(data.info[x][0] + " has open " + data.info[x][1]);
    }
});

//server side
let modal = new Map();

io.on('connection', (socket) => {

    //Here we are sending any new connections a list of all current modals being viewed with Identifiers.
    //You could send all of the items inside the map() using map.entries

    let currentInfo = [];

    modal.forEach((value, key) => {
        currentInfo.push([key, value]);
    });

    socket.emit('recModalInfo', {
        info: currentInfo
    });

    socket.on('openedModal', (data) => {
        modal.set(socket.id, data.modalIdentifier);
    });

    socket.on('closedModal', (data) => {
        modal.delete(socket.id);
    });

});

我已经包含了客户端和服务器端,但由于你明显没有在这里使用vanilla JavaScript,因此客户端代码更多地表示了你可以适应的需求。

  

但是如果用户打开了一个模态怎么办 - &gt;套接字通知其他用户 - &gt;   然后另一个用户登录到系统(这意味着他没有得到   套接字通知并可能最终打开相同的模态。

当用户连接到服务器并创建套接字时,io.on('connection', (socket)=>{ });总是运行,这允许我们发送一个详细说明所有当前模态打开的发射和标识符。

  

用户(客户代理)应该知道模态当前是否已打开   其他客户支持,以避免处理数据时出现冲突。

由于您的客户端将收到有关当前打开的模式的信息,您可以选择通过不渲染用于访问模式的代码来使它们在DOM上不可用。您还可以在地图上处理检查,如果它是1-1场景并构建更多功能,如果说管理员或特殊人员出于某种原因想要查看模态或根本不想查看模态。