From 8a4cf9d3d88090397bde419d7f6894ead7d5b7c6 Mon Sep 17 00:00:00 2001 From: svmlitimur Date: Thu, 30 May 2024 02:22:05 +0300 Subject: [PATCH] Add retry wrapper example --- JavaScript/a-retry-wrapper.js | 69 +++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 JavaScript/a-retry-wrapper.js diff --git a/JavaScript/a-retry-wrapper.js b/JavaScript/a-retry-wrapper.js new file mode 100644 index 0000000..d342df4 --- /dev/null +++ b/JavaScript/a-retry-wrapper.js @@ -0,0 +1,69 @@ +'use strict'; + +const retry = (options = {}) => { + const { + task = null, + recovery = null, + handleRecovery = false, + tryCount = 3, + } = options; + + const errors = []; + let count = 0; + + return async (...args) => { + while (count++ < tryCount) { + try { + const res = await task(...args); + return res; + } catch (err) { + errors.push(err); + if (recovery) { + await recovery(...args).catch((err) => { + if (!handleRecovery) throw err; + errors.push(err); + }); + } + } + } + const finallyError = new Error('To many tries'); + throw new AggregateError([...errors, finallyError]); + }; +}; + +// Usage +let targetUrl = 'wrong-url'; + +const sendRequest = () => + new Promise((resolve, reject) => { + fetch(targetUrl).then( + (res) => { + console.log('Got response'); + resolve(res); + }, + (err) => { + console.error('Got error'); + reject(err); + }, + ); + }); + +const updateUrl = (url) => + new Promise((resolve, reject) => { + setTimeout(() => { + targetUrl = url; + // reject(new Error('Can not update url')); + console.log('Updated url'); + resolve(); + }, 1_000); + }); + +const trySendRequest = retry({ + task: sendRequest, + recovery: updateUrl, + handleRecovery: true, + tryCount: 3, + // tryCount: 1, +}); + +trySendRequest('https://google.com').then(console.log); \ No newline at end of file