清除数组中一个项目的超时 - javascript

时间:2017-02-17 19:49:35

标签: javascript arrays node.js settimeout

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

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

但是说在调度后10000毫秒之后,上传者想要从(for)循环中取出bob。如何在不取消调度程序的情况下取出bob。或者有更好的方法吗? (它在节点服务器上)

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

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

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

谢谢,js的新手并感谢他们的帮助!

3 个答案:

答案 0 :(得分:2)

setTimeout返回一个对象。存储在某个地方,然后使用该对象调用clearTimeout,如下所述:

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

答案 1 :(得分:0)

您拥有代码的方式,所有超时都会在同一时间到期。

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

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

答案 2 :(得分:0)

一个选项可能是,如果应该从收件人中删除用户,则添加标记;如果标记为on,则跳过发送给该人。然后在可以的时候清理标记用户。 e.g。

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

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