I found an exponential backoff function which is supossed to retry an API fetch in case of an error in exponential delays:
async function exponentialBackoff(toTry, max, delay) {
console.log('max', max, 'next delay', delay);
try {
let response = await toTry()
return response;
} catch (e) {
if (max > 0) {
setTimeout(function () {
exponentialBackoff(toTry, --max, delay * 2);
}, delay);
} else {
console.log('maximum amount of tries exceeded', e);
return e;
}
}
}
I then use the function with the help of GA API library to make a request. On purpose I am sending an invalid body to make the request fail:
response = await exponentialBackoff(async function () {
return await gapi.client.request({
path: 'https://analyticsadmin.googleapis.com/v1beta/properties',
method: 'POST',
body: property
})
}, 10, 30)
console.log("NEXT LINE");
What I would expect is that the exponential backoff will run out of all attempts (10) and only after that it would execute the console log.
What actually happens is that the console log gets executed right after first try. What am I doing wrong there?
Thank you
>Solution :
-
Promisify
setTimeoutandawaitit. A promisified variant isfunction sleep(ms) { return new Promise(res => { setTimeout(res, ms); }); } -
awaitexponentialBackoffin thecatchblock.
The fixed code is:
function sleep(ms) { return new Promise(res => { setTimeout(res, ms); }); }
async function exponentialBackoff(toTry, max, delay) {
console.log('max', max, 'next delay', delay);
try {
let response = await toTry()
return response;
} catch (e) {
if (max > 0) {
await sleep(delay);
await exponentialBackoff(toTry, --max, delay * 2);
} else {
console.log('maximum amount of tries exceeded', e);
return e;
}
}
}