如何在运行时阻止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循环不执行两次?的主要内容,如果未能解决你的问题,请参考以下文章

ClosedXML Webform - foreach 循环循环两次

PHP循环阻止其余代码执行[关闭]

粗略总结for循环与foreach()循环区别

python一个脚本循环两次

如何限制 Parallel.ForEach?

foreach跳出循环不往下走