Javascript - 超时线程

时间:2014-04-08 17:12:55

标签: javascript multithreading node.js settimeout

我想知道JavaScript中是否存在以下问题的可能实现:

我想开发一个Web应用程序来监视多个传入连接的不活动状态。 10个或更多客户端将连接到Web应用程序(通过WebSockets),导致2分钟超时计时器启动。如果客户没有与上述内部的应用程序联系,它将标记为"不活动"。

在更传统的"语言我会用几个线程(每个客户端一个)解决上述情况,这会启动并触发超时定时器。

但据我所知,JavaScript是单线程的,所以我不知道从哪里开始..

2 个答案:

答案 0 :(得分:0)

为您的连接创建一个数组,例如:

var connections = [{id: 1, lastActive: ...,}, ...];

然后,使用setTimeout函数定期检查这些:

var interval = 10000; // 10 seconds in milliseconds
var expireTime = 1000 * 60 * 2 // 2 minutes in milliseconds
setTimeout(function() {
  now = new Date()
  for(i = 0; i < connections.length; ++i) {
    if(now - connections[i]['lastActive'] > expireTime) {
      // Do something to make this connection inactive.
    }
  }
}, interval);

答案 1 :(得分:0)

JavaScript是在客户端运行的,因此每个用户都将在本地运行JS。

编辑: Jason在评论中指出我错过了你在文章中添加的Node.js标签;因此,对于Node.js,上述陈述不正确。

我理解你的问题是&#34;如何用JS编写2分钟的空闲支票?&#34;。就个人而言,我的JS代码中包含一个全局信息,用于跟踪用户上次执行操作的时间。在每个JS函数结束时,将此变量设置为当前时间(More Info Here.)。接下来,使用JS间隔定期检查该值(More Info Here.)。

你最终会得到这样的东西:

var myTime = new Date().getTime();
var timeout = 2 * 60 * 1000;
var interval = 30 * 1000;
window.setInterval(checkTimeout(),interval);

function checkTimeout() {
    var t = new Date().getTime();
    t = t-myTime;
    if (t >= timeout) {
        alert("You've been Idle for 5s+");
    }
    window.setInterval(checkTimeout(),interval);
}
function setTime() {
    myTime = new Date().getTime();
}

Here是jsfiddle的一个例子。