Как повторить попытку ошибки перехвата функции async / await? - PullRequest
1 голос
/ 16 февраля 2020

Я довольно новичок в JS и программировании в целом, и я столкнулся со следующей проблемой при попытке реализовать try / catch в моей функции asyn c. Это выглядит так:

(async function main() {
    try {
        await myFunc();
    } catch (e) {
        console.log(e)
    }

    setTimeout(main, 2000);
}) ();

Как вы можете видеть, оно зацикливается вызовом setTimeout, что делает его бесконечным ... если только он не улавливает ошибку. Естественно, я хочу попытаться повторить myFun c в некоторых случаях e, но не знаю, как это сделать, не удаляя setTimeout (и здесь важна задержка в 2 с).

Я пытался использовать метки :

let critErrCount;

(async function main() {
    critErrCount = 0;
    lbl:
    try {
        await myFunc();
    } catch (e) {
        if (e instanceof errType1) {
            console.log(`errType1: ${e}`);
            continue lbl;
        } else if (e instanceof errType2) {
            critErrCount += 1;
            console.log(`errType2: ${e}`);
            console.log(`critErrCount: ${critErrCount}`);

            if (critErrCount == 5) {
                console.log(`Too many critErrs, aborting...`)
                process.exit;
            }
            continue lbl;
        } else { 
            process.exit
        }
    }

    setTimeout(main, 2000);
}) ();

И, конечно же, это не сработало, потому что, как я узнал, «continue» не ведет себя как «goto» в других языках, а работает только в правильных циклах (forEach, тогда как , для, et c.). Поскольку setTimeout внутри блока catch также не будет работать из-за особенностей nodejs времени выполнения (отображается как «Неверное продолжение оператора»), у меня нет идей.

...