如何在单页面应用程序中处理socket.io事件?

时间:2014-10-01 11:43:16

标签: javascript node.js socket.io

我正在开发单页面应用程序,此应用程序是分析的实时可视化。

使用的技术/编程语言:

AngularJs
Node.js 
socket.io

我在应用程序中有以下route

  1. / activePage
  2. / referrerPage
  3. / devicePage
  4. 我在使用socket.io做什么?

    1. 当我路由到/activePage时,我从客户端触发 activePage 事件。 服务器正在侦听特定事件,它将获取与该事件相关的一些数据,通过以某个时间间隔发出一些事件将数据发送到客户端。

    2. 当我换到另一条路线时,假设/devicePage。它将与上面的内容一样,使用不同的事件名称。

    3. 问题:客户端获取两个不同的数据,一个用于activePage和devicePage。我只期望一个数据属于最后一条路线devicePage

    4. 服务器端代码:

          socket.on("activePage", function (data) {
              setInterval(function () {
                  realTime.getActivePageData(data, function (result) {
                      socket.volatile.emit("active", result);
                  });
              }, 3000);
          });
      
          socket.on("devicePage", function (data) {
              setInterval(function () {
                  realTime.getDeviceData(data, function (result) {
                      socket.volatile.emit("device", result);
                  });
              }, 3000);
          });
      

      客户端代码:

          SocketService.on("active", function (data) {
            console.log("active", data);
          });
      
          SocketService.on("device", function (data) {
           console.log("device", data);
          });
      

      注意:此应用程序适用于多个用户。

      我该如何解决这个问题?

      任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

好像你在" activePage"上开始了间隔。事件,反复发送“活跃”的事件。数据。由于您没有将此间隔保存到变量中,因此我认为它不会在代码中的任何其他位置清除。

当你在一个新事件上开始一个新的事件时,一个解决方案是清除前一个间隔,如下所示:

var activePageInterval; //this variable will hold the interval
socket.on("activePage", function (data) {
    activePageInterval = setInterval(function () {
        realTime.getActivePageData(data, function (result) {
            socket.volatile.emit("active", result);
        });
    }, 3000);
});

socket.on("devicePage", function (data) {
    clearInterval(activePageInterval); //clearing the interval to stop sending 'active' data
    setInterval(function () {
        realTime.getDeviceData(data, function (result) {
            socket.volatile.emit("device", result);
        });
    }, 3000);
});

(反之亦然 - 您也可以使用具有更通用名称的相同变量,因为我假设您从不希望定期播放超过1种类型的数据,只适用于当前页面的数据)