Javascript-超时线程

Javascript-超时线程,javascript,multithreading,node.js,settimeout,Javascript,Multithreading,Node.js,Settimeout,我想知道是否有可能在JavaScript中实现以下问题: 我想开发一个web应用程序来监视几个传入连接的不活动状态。10个或更多客户端将连接到web应用程序(通过WebSockets),导致2分钟超时计时器启动。如果客户没有联系应用程序进行上述内部访问,则会将其标记为“不活动” 用一种更“传统”的语言,我会用几个线程(每个客户端一个)解决上述情况,这些线程会启动并触发超时计时器 但就我所知,JavaScript是单线程的,所以我不知道从哪里开始 为您的连接创建一个数组,例如: var conne

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

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

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


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

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

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);
var区间=10000;//10秒(毫秒)
var expireTime=1000*60*2//2分钟(毫秒)
setTimeout(函数(){
现在=新日期()
对于(i=0;iexpireTime){
//请执行某些操作以使此连接处于非活动状态。
}
}
},间隔);

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

编辑:Jason在评论中指出,我没有看到你在文章中添加的Node.js标签;因此,对于Node.js,上述语句不是正确的

我理解你的问题是“我怎么能用JS写一张2分钟的空头支票?”。就我个人而言,我会在你的JS代码中有一个全局代码来跟踪用户最后一次执行操作的时间。在每个JS函数的末尾,将此变量设置为当前时间()。接下来,使用JS间隔定期检查该值()

你会得到这样的结果:

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();
}

是jsfiddle上的一个示例。

FWIW(为了示例,您不介意jQuery):--在本文中,我从10个“工作者”开始,超时10秒。我使用jsFildde AJAX api并进行“随机中断”调用(0-12秒范围内的任意位置)。那些有11秒和12秒的应该是“超时”。你可以(通过表格)看到,它们都不可避免地超时,这只是一个概率问题,在“下一次”暂停时间>10。哇,感谢这个很棒的示例。我将尝试进一步研究workers,并查看可能的实现。LePhleg正在使用node.js,这是服务器端。感谢您的详细回复,并对延迟表示抱歉。我发现这种不断检查的方法有些费劲,但正如我所看到的,其他的答案对JS也提出了类似的建议。@LePhleg,很高兴它很有帮助。至于资源消耗,我最好的建议是一次只运行其中一个(检查同一功能中的所有用户);即使这样,这也是基于推测,因为我不知道setInterval函数的效率有多高。