Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. function retry(func, argsToFunc = [], retryCountLimit = 1, interval = 1000) {
  2.  
  3. setGlobalObj("logs.retry."+func.name)
  4. let rr = window.logs.retry[func.name]
  5.  
  6. switch (rr.retryStatus) {
  7. case undefined:
  8. case "failed":
  9. recordDown()
  10. case "later":
  11. toRetry()
  12. break
  13.  
  14. case "successful":
  15. case "depleted":
  16. case "endless":
  17. delete window.logs.retry[func.name]
  18. rr = rr.result
  19. break
  20. }
  21.  
  22. return rr
  23.  
  24.  
  25.  
  26. function recordDown() {
  27. [rr.retryLastPlanAt, rr.retryCount] = [Date.now(), ++rr.retryCount || 1]
  28. }
  29.  
  30.  
  31. function toRetry() {
  32. if (rr.retryCount > retryCountLimit) {
  33. reply("depleted")
  34. retry(func)
  35. return
  36. }
  37. if (rr.laterCount > 3) {
  38. reply("endless")
  39. retry(func)
  40. return
  41. }
  42. reply("pending")
  43. rr.retryDelayID = setTimeout(() => {
  44. clearTimeout(rr.retryDelayID)
  45. delete rr.retryDelayID
  46. doRetry()
  47. }, rr.retryLastPlanAt + interval - Date.now())
  48.  
  49.  
  50. function reply(state) {
  51. rr.retryStatus = state;
  52. ({
  53. pending: () => {
  54. console.log(`The function %c${func.name}%c will be retried the № ${rr.retryCount} time`,
  55. "color: dodgerblue", "all: inherit")
  56. },
  57. later: () => {
  58. rr.laterCount = ++rr.laterCount || 1
  59. console.log(`The function %c${func.name}%c's retry falls to the next round`,
  60. "color: dodgerblue", "all: inherit")
  61. },
  62. endless: () => {
  63. console.warn(`The function %c${func.name}%c's retry is abandoned due to endless rounds`,
  64. "color: dodgerblue", "all: inherit")
  65. },
  66. failed: () => {
  67. console.warn(`The function %c${func.name}%c's № ${rr.retryCount} retry failed`,
  68. "color: dodgerblue", "all: inherit")
  69. },
  70. depleted: () => {
  71. --rr.retryCount
  72. console.warn(`The function %c${func.name}%c has already been retried ${rr.retryCount} times but still failed`,
  73. "color: dodgerblue", "all: inherit")
  74. },
  75. successful: () => {
  76. console.log(`%cThe function %c${func.name}%c's № ${rr.retryCount} retry succeeded`,
  77. "color: forestgreen", "color: dodgerblue", "color: forestgreen")
  78. }
  79. })[state]()
  80. }
  81.  
  82.  
  83. async function doRetry() {
  84. rr.result = await func(...argsToFunc)
  85. rr.result &&
  86. rr.result.constructor === Object &&
  87. rr.result.retryStatus !== undefined
  88. ? reply("failed")
  89. : rr.result === "later"
  90. ? reply("later")
  91. : reply("successful")
  92. retry(func, argsToFunc, retryCountLimit, interval)
  93. }
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement