mirror of
https://github.com/nuxt/nuxt.git
synced 2025-02-20 15:41:11 +00:00
feat(nuxt): add polling functionality to asyncData
This commit is contained in:
parent
e0638856c1
commit
3f533b3796
@ -92,6 +92,10 @@ export interface AsyncDataOptions<
|
|||||||
* @default 'cancel'
|
* @default 'cancel'
|
||||||
*/
|
*/
|
||||||
dedupe?: 'cancel' | 'defer'
|
dedupe?: 'cancel' | 'defer'
|
||||||
|
/**
|
||||||
|
* Polling interval in milliseconds
|
||||||
|
*/
|
||||||
|
pollEvery?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AsyncDataExecuteOptions {
|
export interface AsyncDataExecuteOptions {
|
||||||
@ -238,6 +242,7 @@ export function useAsyncData<
|
|||||||
options.immediate = options.immediate ?? true
|
options.immediate = options.immediate ?? true
|
||||||
options.deep = options.deep ?? asyncDataDefaults.deep
|
options.deep = options.deep ?? asyncDataDefaults.deep
|
||||||
options.dedupe = options.dedupe ?? 'cancel'
|
options.dedupe = options.dedupe ?? 'cancel'
|
||||||
|
options.pollEvery = options.pollEvery ?? 0
|
||||||
|
|
||||||
// Create or use a shared asyncData entity
|
// Create or use a shared asyncData entity
|
||||||
const initialCachedData = options.getCachedData!(key, nuxtApp)
|
const initialCachedData = options.getCachedData!(key, nuxtApp)
|
||||||
@ -262,6 +267,27 @@ export function useAsyncData<
|
|||||||
// Don't expose default function to end user
|
// Don't expose default function to end user
|
||||||
delete asyncData._default
|
delete asyncData._default
|
||||||
|
|
||||||
|
let pollTimer: number | undefined
|
||||||
|
|
||||||
|
const startPolling = () => {
|
||||||
|
if (import.meta.client && options.pollEvery && !pollTimer) {
|
||||||
|
pollTimer = window.setInterval(() => {
|
||||||
|
asyncData.refresh()
|
||||||
|
}, options.pollEvery)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const stopPolling = () => {
|
||||||
|
if (pollTimer) {
|
||||||
|
clearInterval(pollTimer)
|
||||||
|
pollTimer = undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.pollEvery && options.immediate) {
|
||||||
|
startPolling()
|
||||||
|
}
|
||||||
|
|
||||||
asyncData.refresh = asyncData.execute = (opts = {}) => {
|
asyncData.refresh = asyncData.execute = (opts = {}) => {
|
||||||
if (nuxtApp._asyncDataPromises[key]) {
|
if (nuxtApp._asyncDataPromises[key]) {
|
||||||
if ((opts.dedupe ?? options.dedupe) === 'defer') {
|
if ((opts.dedupe ?? options.dedupe) === 'defer') {
|
||||||
@ -277,6 +303,9 @@ export function useAsyncData<
|
|||||||
return Promise.resolve(cachedData)
|
return Promise.resolve(cachedData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (options.pollEvery) {
|
||||||
|
stopPolling()
|
||||||
|
}
|
||||||
asyncData.pending.value = true
|
asyncData.pending.value = true
|
||||||
asyncData.status.value = 'pending'
|
asyncData.status.value = 'pending'
|
||||||
// TODO: Cancel previous promise
|
// TODO: Cancel previous promise
|
||||||
@ -326,6 +355,11 @@ export function useAsyncData<
|
|||||||
|
|
||||||
delete nuxtApp._asyncDataPromises[key]
|
delete nuxtApp._asyncDataPromises[key]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (options.pollEvery) {
|
||||||
|
startPolling()
|
||||||
|
}
|
||||||
|
|
||||||
nuxtApp._asyncDataPromises[key] = promise
|
nuxtApp._asyncDataPromises[key] = promise
|
||||||
return nuxtApp._asyncDataPromises[key]!
|
return nuxtApp._asyncDataPromises[key]!
|
||||||
}
|
}
|
||||||
@ -389,7 +423,10 @@ export function useAsyncData<
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
if (hasScope) {
|
if (hasScope) {
|
||||||
onScopeDispose(off)
|
onScopeDispose(() => {
|
||||||
|
off()
|
||||||
|
stopPolling()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user