【问题标题】:Clearing timeouts for one item in array - javascript清除数组中一项的超时 - javascript
【发布时间】:2017-02-17 19:49:34
【问题描述】:

假设我有一个消息服务,可以安排给朋友的消息,

用户上传他们的朋友,以及他们想要发送的何时

但是说在调度后 10000 毫秒后,上传者想要让 bob 退出 (for) 循环。如何在不取消调度程序的情况下将 bob 带走。还是有更好的方法来做到这一点? (它在节点服务器上)

var friends = [‘John’, ‘bob’, ‘billy’, ‘dan’];

for (i in friends) {
    setTimeout(function(){
        sendMessage(friend[i])
    },3000000)
}

我觉得有更好的方法可以做到这一点,但没有找到任何东西

谢谢,js新手,感谢帮助!

【问题讨论】:

  • 注意:我认为你会对花引号有疑问。

标签: javascript arrays node.js settimeout


【解决方案1】:

setTimeout 返回一个对象。将其存储在某处,然后使用该对象调用clearTimeout,如果您想这样做,如下所述:

https://stackoverflow.com/a/6394645/1384352

【讨论】:

    【解决方案2】:

    按照您的代码方式,所有超时将同时到期。

    相反,您只能在当前超时结束时启动下一次超时。在下面的演示中,在以 1 秒的间隔发送消息时删除了“Billy”。事实上,比利没有收到任何消息:

    var friends = ['John', 'Bob', 'Billy', 'Dan'];
    
    (function loop(i) {
        setTimeout(function(){
            if (i >= friends.length) return; // all done        
            sendMessage(friends[i]);
            loop(i+1); // next
        }, 1000);
    })(0); // call the function with index 0
    
    function sendMessage(friend) { // mock
        console.log('send message to ' + friend);
    }
    
    // now remove 'Billy' after 2.5 second
    setTimeout(function () {
        console.log('remove ' + friends[2]);
        friends.splice(2, 1);
    }, 2500);

    【讨论】:

      【解决方案3】:

      如果应该从收件人中删除用户,并且如果标志打开,则您可以添加标志,您可以跳过发送给该人的选项。然后在可以的时候清理标记的用户。例如

      if (!friends[i].isRemoved) {
          setTimout.....
      }
      

      其他选项是您为每个朋友定义单独的计时器,然后您可以取消您想要的任何人。

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 2012-02-10
        • 2012-12-29
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多