當使用@pinia/nuxt時,在setInterval迴圈中執行的HTTP請求會在每次setInterval迭代中執行。
P粉596191963
P粉596191963 2023-07-27 16:02:59
0
1
552
<p>我正在嘗試使用@pinia/nuxt和nuxt 3建立計時器。當定時器啟動時,我還想發起一個HTTP請求來同步我的資料庫。 </p><p>我面臨的問題是,每當我呼叫start動作時,HTTP請求都會在setInterval循環的每次迭代中執行,而我只希望它執行一次。 </p><p>以下是我的pinia模組。我是透過元件中的onClick事件呼叫start動作的。 </p><p><code></code><code></code></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>我的packages.json檔案如下:</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粉596191963
P粉596191963

全部回覆(1)
P粉384679266

正如我在評論中提到的,實現即時功能的正確方法是使用sockets。但是,如果您需要以輪詢的方式進行操作,可以編寫一個guard,類似於以下範例:

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);
  },
  // ...
}

應該可以

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板