假设我有一个消息服务,可以向朋友安排消息,
用户上传他们的朋友,以及 他们想要发送他们
但是说在调度后10000毫秒之后,上传者想要从(for)循环中取出bob。如何在不取消调度程序的情况下取出bob。或者有更好的方法吗? (它在节点服务器上)
var friends = [‘John’, ‘bob’, ‘billy’, ‘dan’];
for (i in friends) {
setTimeout(function(){
sendMessage(friend[i])
},3000000)
}
我觉得有更好的方法可以做到这一点,但没有找到任何东西
谢谢,js的新手并感谢他们的帮助!
答案 0 :(得分:2)
setTimeout
返回一个对象。存储在某个地方,然后使用该对象调用clearTimeout
,如下所述:
答案 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.....
}
其他选项是您为每位朋友定义个人计时器,然后您可以取消您想要的人。