Javascript 关闭函数的上一个实例nodejs

Javascript 关闭函数的上一个实例nodejs,javascript,node.js,Javascript,Node.js,我在nodejs上构建了一个api。 在收到一个用户的第一个请求时,我想触发一个发送电子邮件功能,在15分钟后发送邮件。但是,如果在这15分钟之间对同一用户发出新请求,我想关闭上一个计时器,并从15分钟开始重新启动计数器 我面临的问题是,如何检查之前是否已经对api进行了调用 我能想到的一个可能的解决方案是在db中存储一个标志,并在每次api调用时更新,这将告诉用户是否触发了sendEmail。但也许我认为,如果在运行时有一个存储先前状态的变量,这也是可能的。可以这样做吗?让我们假设每个用户都有

我在nodejs上构建了一个api。 在收到一个用户的第一个请求时,我想触发一个发送电子邮件功能,在15分钟后发送邮件。但是,如果在这15分钟之间对同一用户发出新请求,我想关闭上一个计时器,并从15分钟开始重新启动计数器

我面临的问题是,如何检查之前是否已经对api进行了调用


我能想到的一个可能的解决方案是在db中存储一个标志,并在每次api调用时更新,这将告诉用户是否触发了sendEmail。但也许我认为,如果在运行时有一个存储先前状态的变量,这也是可能的。可以这样做吗?

让我们假设每个用户都有一些唯一的标识符。然后,您可以创建一个
Map
对象,该对象以userID作为键,数据对象包括一个计时器作为值

const userEmailData = new Map();

function sendUserEmailWithDelay(userId, emailContent) {
    let userData = userEmailData.get(userId);
    // if existing userData, then clear existing timer
    if (userData) {
        clearTimeout(userData.timer);
    }

    // set new timer for 15 minutes from now
    userData = {userId, emailContent, timer};
    let timer = setTimeout(() => {
        // remove our object from the Map
        userEmailData.delete(userId);
        // send the email here using userData to know what to send and to whom
    }, 15 * 60 * 1000);

    // put this userData object into the Map
    userEmailData.set(userId, userData);
}

您是如何管理它在15分钟后发送电子邮件的?是否添加了
setTimeout
?内存中是否已经有用户对象列表?还是只在数据库中?这是否必须是防弹的,这样,如果你的服务器宕机,那么当服务器恢复时,每个人都会收到他们的电子邮件?@SonuBamniya是的,我正在使用
setTimeout
等待15mins@jfriend00我在数据库中确实有用户对象,但我正在尝试一种不用它的方法。目前没有,没有考虑或实现它是防弹的,那么您可以创建一个对象,并在对象中使用唯一键为用户存储超时,在处理API时,您可以检查该用户的值是否存在于该对象中,如果是,您可以使用
cleartimout
清除现有超时