當使用@pinia/nuxt時,在setInterval迴圈中執行的HTTP請求會在每次setInterval迭代中執行。
P粉596191963
2023-07-27 16:02:59
<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>
正如我在評論中提到的,實現即時功能的正確方法是使用sockets。但是,如果您需要以輪詢的方式進行操作,可以編寫一個guard,類似於以下範例:
應該可以