40 lines
876 B
JavaScript
40 lines
876 B
JavaScript
// Keep only the newest generation's result visible to the browser.
|
|
export const createRegenerationQueue = ({ generate, onSuccess, onError, delay = 100 }) => {
|
|
let timer
|
|
let running = false
|
|
let revision = 0
|
|
let closed = false
|
|
|
|
const run = async () => {
|
|
if (closed || running) return
|
|
running = true
|
|
const started = revision
|
|
try {
|
|
await generate()
|
|
if (!closed && started === revision) onSuccess()
|
|
} catch (error) {
|
|
if (!closed && started === revision) onError(error)
|
|
} finally {
|
|
running = false
|
|
if (!closed && started !== revision) schedule()
|
|
}
|
|
}
|
|
|
|
const schedule = () => {
|
|
clearTimeout(timer)
|
|
timer = setTimeout(run, delay)
|
|
}
|
|
|
|
return {
|
|
request() {
|
|
if (closed) return
|
|
revision += 1
|
|
schedule()
|
|
},
|
|
close() {
|
|
closed = true
|
|
clearTimeout(timer)
|
|
},
|
|
}
|
|
}
|