Home  >  Q&A  >  body text

When using @pinia/nuxt, placing the HTTP request outside setInterval will be executed on every setInterval iteration.

<p>I'm trying to build a timer using @pinia/nuxt and nuxt 3. When the timer starts, I also want to initiate an HTTP request to synchronize my database. </p><p>The problem I'm facing is that every time I call the start action, an HTTP request is made for each iteration of the setInterval loop, and I only want to run it once. </p><p>This is the pinia module. I call the start action in the component's onClick event. </p> <pre class="brush:php;toolbar:false;">state: () => ({ timer: { id: null, isRunning: false, time: 5, timer: 0, state: null, } as Timer, }), actions: { start() { this.timer.isRunning = true this.syncTimer() if (!this.timer.timer) { this.timer.timer = setInterval(() => { if (this.timer.time > 0) { this.timer.time-- } else { clearInterval(this.timer.timer) this.reset() } }, 1000) } }, stop() { this.timer.isRunning = false clearInterval(this.timer.timer) this.timer.timer = 0 }, reset() { this.stop() this.timer.time = 1500 }, syncTimer() { backendAPI<Timer>('/api/timer', { method: 'POST', body: this.timer }).then(({ error, data }) => { if (!error.value) { const id = data.value?.id ?? "" this.timer.id = id this.timer.state = "created" } }) } }</pre> <p>My packages.json file is as follows:</p> <pre class="brush:php;toolbar:false;">"devDependencies": { "@fortawesome/fontawesome-free": "^6.4.0", "@fullcalendar/core": "^6.1.8", "@fullcalendar/daygrid": "^6.1.8", "@fullcalendar/interaction": "^6.1.8", "@fullcalendar/timegrid": "^6.1.8", "@fullcalendar/vue3": "^6.1.8", "@iconify/vue": "^4.1.1", "@kevinmarrec/nuxt-pwa": "^0.17.0", "@mdi/font": "^7.2.96", "@nuxtjs/google-fonts": "^3.0.0", "@pinia-plugin-persistedstate/nuxt": "^1.1.1", "nuxt": "3.4.2", "sass": "^1.62.0", "vuetify": "^3.1.15" }, "dependencies": { "@pinia/nuxt": "^0.4.11", "pinia": "^2.1.3", "vite-plugin-vuetify": "^1.0.2" }</pre> <p><br /></p>
P粉413704245P粉413704245450 days ago535

reply all(1)I'll reply

  • P粉976737101

    P粉9767371012023-07-29 10:03:44

    As I mentioned in the comments, the correct way to implement real-time functionality is to use sockets. However, if you need to do it in a polling manner, you can write a guard, similar to the following example:

    actions: {
      start() {
        if (this.timer.isRunning) return;
    
        this.timer.isRunning = true;
        this.syncTimer();
    
        this.timer.timer = setInterval(() => {
          if (this.timer.time > 0) {
            this.timer.time--;
          } else {
            clearInterval(this.timer.timer);
            this.reset();
          }
        }, 1000);
      },
      // ...
    }

    Hope it’s useful

    reply
    0
  • Cancelreply