TSLint - Обещания должны быть обработаны надлежащим образом с помощью `finally` - PullRequest
0 голосов
/ 26 ноября 2018

Я получаю эту ошибку от TSLint и пытаюсь понять, почему она жалуется.

У меня есть функция, которая вызывает другой метод, который возвращает обещание, но первая функция не возвращаетобещание, потому что оно просто ожидает его завершения и обновления внутреннего состояния.

Я упростил его до этой функции и просто использую Q() для имитации вызова, который возвращает обещание.

export function DoSomethingAsync(): void {
    Q().then(r => {
        console.log('test');
    }).catch(err => {
        log.error("wow");
    }).finally(() => {
        log.info("at finally")
    });
}

Когда я запускаю tslint в моем проекте, я получаю следующую ошибку:

ОШИБКА: C: /dev/local_cache_service.ts [31, 5]: Обещания должны обрабатываться соответствующим образом

Если я удаляю вызов вызова finally, tslint проходит без ошибок.

export function DoSomethingAsync(): void {
    Q().then(r => {
        console.log('test');
    }).catch(err => {
        log.error("wow");
    });
}

Когда я создаю ту же функцию в начальном проекте машинописного текста, это поведение не воспроизводится ...

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Решением было добавить вызов к .done() в конце цепочки вызовов обещания.

Из того, что я понял done преобразует любые необработанные исключения в обычное необработанное исключение.

0 голосов
/ 27 ноября 2018

Это жалоба из правила без плавающих обещаний .Согласно его описанию:

Создание Promise, а не его сохранение или возврат может позволить другому коду работать независимо от его результата.Это может вызвать неожиданное и / или недетерминированное поведение в зависимости от внешних факторов синхронизации.

Обычно лучше возвращать обещания из функций, которые их запускают, а затем обрабатывать их в вызывающем коде.

Использовать no-unused-expression в дополнение к этому правилу, чтобы показать еще больше плавающих обещаний.

Конкретно в вашем случае это потому, что вы запускаете код в .finally блоке после the .catch блок.Это считается опасным правилом, потому что если код в .finally выдает ошибку, он не будет обработан вызывающим кодом.

Лучшее, что вы можете сделать, - это return обещаниепоэтому тип возвращаемой функции - Promise / Q вместо void.

Совет: вы можете запустить tslint -t stylish или tslint -t verbose, чтобы увидеть имена правил вместе с их жалобами!

...