Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

async/await doesn't wait before executing next line in JS

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.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

What actually happens is that the console log gets executed right after first try. What am I doing wrong there?

Thank you

>Solution :

  1. Promisify setTimeout and await it. A promisified variant is

    function sleep(ms) { return new Promise(res => { setTimeout(res, ms); }); }
    
  2. await exponentialBackoff in the catch block.

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;
        }
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading