如何在运行时阻止forEach循环不执行两次?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在运行时阻止forEach循环不执行两次?相关的知识,希望对你有一定的参考价值。
我有一个名为sendMail
的函数,它可以获得一些电子邮件地址并为这些用户发送邮件。
单击用户界面中的按钮可调用此功能。
但是,如果多次调用此函数,则电子邮件也会被多次发送。
我想阻止函数在它已经运行时再次执行。我的意思是,如果用户调用它,我想阻止按钮以防止用户再次单击并再次调用此函数。
这是发送邮件的途径
routes.get('/sendMail', (req, res)=>{
db.find({ subscribed: true}, (err, result) => {
if(err){
throw err;
}else{
result.forEach(function(subscriber, index){
setTimeout(function() {
sendMail(subscriber);
}, 3000*index)
});
res.render('records.ejs', {root: '.'});
}
});
});
一旦js是单线程并且我打电话给sendMail
两次,这个函数应该只在当前执行完成后再次执行?
如果这是一个新手问题,我很抱歉。欢迎任何博客文章,教程等。
答案
你可以有这样的东西
processingOjb = {};
routes.get('/sendMail', (req, res)=>{
db.find({ subscribed: true}, (err, result) => {
if(err){
throw err;
}else{
result.forEach(function(subscriber, index){
if (!processingObj[subscriber.id]){
setTimeout(function() {
sendMail(subscriber);
delete processingObj[subscriber.id];
}, 3000*index)
}
processingObj[subscriber.id] = true;
}
});
res.render('records.ejs', {root: '.'});
}
});
});
然后,在解决之前,它不会再次呼叫同一个用户。请注意处理发生错误时会发生的情况,否则您最终会遇到永远不会删除的订阅者。你也可以把时间戳放在那里而不是真/假,只有它存在并且不超过10分钟才能接受它(以避免一些永远阻塞的用户行为)。
但是,如果您有多个实例的负载均衡器,并且您可以多次调用端点,因为不同的服务可以使用它,这不会起作用。在这种情况下,你需要Redis来表示这种行为。
另一答案
我想阻止按钮以防止用户再次点击并再次调用此功能。
经常使用的一种非常简单的方法是在单击按钮后禁用该按钮。这是一个例子:
// Get button reference and set up click handler
document.querySelector("button").addEventListener("click", function(){
// Here's where you'd call your sendMail function
// sendMail();
console.log("send mail has been called");
// Then disable the button:
this.disabled = true;
});
<button>Click Me</button>
以上是关于如何在运行时阻止forEach循环不执行两次?的主要内容,如果未能解决你的问题,请参考以下文章