繁体   English   中英

async/await 在 JS 中执行下一行之前不等待

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

我发现了一个指数退避 function 在指数延迟出错的情况下重试 API 提取:

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;
        }
    }
}

然后我在 GA API 库的帮助下使用 function 发出请求。 我故意发送无效正文以使请求失败:

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"); 

我期望的是指数退避将用完所有尝试(10),并且只有在此之后它才会执行控制台日志。

实际发生的是控制台日志在第一次尝试后立即执行。 我在那里做错了什么?

谢谢

  1. 承诺setTimeoutawait它。 一个承诺的变体是

    function sleep(ms) { return new Promise(res => { setTimeout(res, ms); }); }
  2. catch块中await exponentialBackoff退避。

固定代码是:

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);
            return await exponentialBackoff(toTry, --max, delay * 2);    
        } else {
            console.log('maximum amount of tries exceeded', e);
            return e;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM