Init
This commit is contained in:
+48
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
*
|
||||
* Creates a timer that accepts a `timerCalc` function to perform
|
||||
* calculated timeout retries, such as exponential backoff.
|
||||
*
|
||||
* @example
|
||||
* let reconnectTimer = new Timer(() => this.connect(), function(tries){
|
||||
* return [1000, 5000, 10000][tries - 1] || 10000
|
||||
* })
|
||||
* reconnectTimer.scheduleTimeout() // fires after 1000
|
||||
* reconnectTimer.scheduleTimeout() // fires after 5000
|
||||
* reconnectTimer.reset()
|
||||
* reconnectTimer.scheduleTimeout() // fires after 1000
|
||||
*
|
||||
*/
|
||||
export default class Timer {
|
||||
/**
|
||||
* @param {() => void} callback
|
||||
* @param {(tries: number) => number} timerCalc
|
||||
*/
|
||||
constructor(callback, timerCalc){
|
||||
/** @type {() => void} */
|
||||
this.callback = callback
|
||||
/** @type {(tries: number) => number} */
|
||||
this.timerCalc = timerCalc
|
||||
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
||||
this.timer = undefined
|
||||
/** @type {number} */
|
||||
this.tries = 0
|
||||
}
|
||||
|
||||
reset(){
|
||||
this.tries = 0
|
||||
clearTimeout(this.timer)
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels any previous scheduleTimeout and schedules callback
|
||||
*/
|
||||
scheduleTimeout(){
|
||||
clearTimeout(this.timer)
|
||||
|
||||
this.timer = setTimeout(() => {
|
||||
this.tries = this.tries + 1
|
||||
this.callback()
|
||||
}, this.timerCalc(this.tries + 1))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user