Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function retry(func, argsToFunc = [], retryCountLimit = 1, interval = 1000) {
- setGlobalObj("logs.retry."+func.name)
- let rr = window.logs.retry[func.name]
- switch (rr.retryStatus) {
- case undefined:
- case "failed":
- recordDown()
- case "later":
- toRetry()
- break
- case "successful":
- case "depleted":
- case "endless":
- delete window.logs.retry[func.name]
- rr = rr.result
- break
- }
- return rr
- function recordDown() {
- [rr.retryLastPlanAt, rr.retryCount] = [Date.now(), ++rr.retryCount || 1]
- }
- function toRetry() {
- if (rr.retryCount > retryCountLimit) {
- reply("depleted")
- retry(func)
- return
- }
- if (rr.laterCount > 3) {
- reply("endless")
- retry(func)
- return
- }
- reply("pending")
- rr.retryDelayID = setTimeout(() => {
- clearTimeout(rr.retryDelayID)
- delete rr.retryDelayID
- doRetry()
- }, rr.retryLastPlanAt + interval - Date.now())
- function reply(state) {
- rr.retryStatus = state;
- ({
- pending: () => {
- console.log(`The function %c${func.name}%c will be retried the № ${rr.retryCount} time`,
- "color: dodgerblue", "all: inherit")
- },
- later: () => {
- rr.laterCount = ++rr.laterCount || 1
- console.log(`The function %c${func.name}%c's retry falls to the next round`,
- "color: dodgerblue", "all: inherit")
- },
- endless: () => {
- console.warn(`The function %c${func.name}%c's retry is abandoned due to endless rounds`,
- "color: dodgerblue", "all: inherit")
- },
- failed: () => {
- console.warn(`The function %c${func.name}%c's № ${rr.retryCount} retry failed`,
- "color: dodgerblue", "all: inherit")
- },
- depleted: () => {
- --rr.retryCount
- console.warn(`The function %c${func.name}%c has already been retried ${rr.retryCount} times but still failed`,
- "color: dodgerblue", "all: inherit")
- },
- successful: () => {
- console.log(`%cThe function %c${func.name}%c's № ${rr.retryCount} retry succeeded`,
- "color: forestgreen", "color: dodgerblue", "color: forestgreen")
- }
- })[state]()
- }
- async function doRetry() {
- rr.result = await func(...argsToFunc)
- rr.result &&
- rr.result.constructor === Object &&
- rr.result.retryStatus !== undefined
- ? reply("failed")
- : rr.result === "later"
- ? reply("later")
- : reply("successful")
- retry(func, argsToFunc, retryCountLimit, interval)
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement