linguaielts-api / fronted /src /utils /taskPolling.js
AnhviNguyen
huy hieu + notification
1c2ed83
Raw
History Blame Contribute Delete
986 Bytes
/**
* Poll async Celery task endpoints until done or timeout.
*/
import apiClient from '@/api/client.js'
export function pollTaskResult(getUrl, { intervalMs = 3000, timeoutMs = 180000 } = {}) {
return new Promise((resolve, reject) => {
const interval = setInterval(async () => {
try {
const { data: result } = await apiClient.get(getUrl)
if (result.status === 'done') {
clearInterval(interval)
clearTimeout(timeout)
resolve(result.result)
} else if (result.status === 'error') {
clearInterval(interval)
clearTimeout(timeout)
reject(new Error(result.detail || 'Task failed'))
}
} catch (e) {
clearInterval(interval)
clearTimeout(timeout)
reject(e)
}
}, intervalMs)
const timeout = setTimeout(() => {
clearInterval(interval)
reject(new Error('Timeout — tác vụ mất quá nhiều thời gian'))
}, timeoutMs)
})
}