【问题标题】:set scheduler in express app based on a request, and clear it before set time if required根据请求在快速应用程序中设置调度程序,如果需要,在设置时间之前清除它
【发布时间】:2018-07-11 10:42:33
【问题描述】:

我有一个用于播放直播视频的页面。视频开始后,我们正在捕捉时间和 1 小时后。我们想触发一个套接字事件,该事件将为访客用户隐藏视频,而登录用户可以继续观看。

除了如何调用 clearTimeOut 来清除视频启动时设置的 setTimeOut 对象之外,其他所有设置都已设置。

直播开始时

setTimeoutIds[val] =  setTimeout(function() {
    req.app.io.emit('disable_for_guest',req.body);
    live_events.update({event_id:req.body.eventId},{guest_visibility:false},function(err,data){
        //All ok
    });

}, disable_after_milliseconds);

直播结束时

live_events.update({event_id:req.body.eventId}, 
{guest_visibility:true},function(err,data){

if (req.body.eventId in setTimeoutIds){
    var event_id = req.body.eventId;
    clearTimeout(setTimeoutIds.event_id);
    delete setTimeoutIds.event_id;
} else {
    console.log('Event not found'+req.body.eventId);
}

req.app.io.emit('event_ended',req.body);

请高手推荐!

谢谢

【问题讨论】:

  • 请张贴code 而不是截图。
  • @MukeshSharma 完成

标签: node.js express settimeout


【解决方案1】:

您将setTimeout 返回的Timeout 对象存储在setTimeoutIds[val] 中。我假设valreq.body.eventId

因此,例如,如果 req.body.eventIdabcsetTimeoutIds 现在看起来像这样:

{'abc': <Timeout object>}

然后您尝试访问属性event_id

clearTimeout(setTimeoutIds.event_id);
delete setTimeoutIds.event_id;

您想要做的是访问 名称存储在 event_id 中的属性。

clearTimeout(setTimeoutIds[event_id]);
delete setTimeoutIds[event_id];

确保event_id 确实相等。 req.body.eventId 可能是一个字符串,而您最初使用的是一个整数。

【讨论】:

  • var setTimeoutIds = {};这就是它的声明方式,我怀疑关联数组语法在 JS 中是否有效。
  • 谢谢,但您在示例中使用了对象表示法,而您在答案中指出了数组语法。我已经在使用对象表示法,但它不起作用。我怀疑,当请求返回相同的代码时,它不再知道 setTimeOut 变量,您认为可能是这种情况吗?
  • 我已经扩展了我的答案,希望这能为您指明正确的方向。
  • 好吧,显然setTimeoutIds 变空了。这似乎与这个问题无关,所以我建议提出一个新问题(当然,除非你自己能弄清楚)。
  • 好的,我在stackoverflow.com/q/51301332/9303776创建了新线程
猜你喜欢
  • 2022-10-07
  • 2013-04-30
  • 2021-03-24
  • 2011-03-23
  • 2014-07-16
  • 2014-06-24
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多