Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

155
Views
setInterval() still triggering after clearInterval() in NodeJS

I have the following code setting and clearing an interval inside a NodeJS script.

Starting interval works fine, but when trying to clear it, the stopping interval console will trigger, but the interval will continue firing every minute.

app.get("/api", async (req, res) => {

    active = req.query.active;
    
    let interval = null;

    if (active == "true") {

        console.log("starting interval");

        interval = setInterval(async function() {
            try {
                const Posts = await getPosts();
                const Comments = await getComments();
                sendPosts().then(() => sendComments());

            } catch (e) {
                throw e;
            };
        }, 60000);

        res.json({ reddit: subreddit, discordChannel: discordChannel, activated: true});

    } else {

        console.log("stopping interval");

        clearInterval(interval);
        interval = null;

        res.json({ reddit: subreddit, discordChannel: discordChannel, activated: false});
    }
    
});

What am I missing?

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Your interval variable is declared inside the route handler. Every time the route is called, a new interval variable is created. Reassigning that variable inside one invocation of the route does not change its value during other invocations of the route. You need:

let interval = null;
app.get("/api", async (req, res) => {
    // ...

You should also catch errors properly - your current approach will result in unhandled rejections here:

    interval = setInterval(async function() {
        try {
            const Posts = await getPosts();
            const Comments = await getComments();
            sendPosts().then(() => sendComments());

        } catch (e) {
            throw e;
        };
    }, 60000);

Only throw if there's something that can handle it up the call stack - if not, you should do whatever you reasonably can with the error at that point and stop without throwing.

about 4 years ago · Juan Pablo Isaza Report

0

You need to move "let interval" outside of the call to app.get().

Right now the variable is declared inside the closure of the function which means it gets initialized every time a request comes in.

If it's outside the function, the variable becomes part of the global scope and its value will be remembered between requests.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!