TSLint - 必须使用“finally”妥善处理承诺

TSLint - Promises must be handled appropriately with `finally`

我从 TSLint 收到这个错误,我试图理解它抱怨的原因。

我有一个调用另一个方法的函数,该方法 return 是一个承诺,但第一个函数没有 return 承诺,因为它只是等待它完成并更新内部状态。

我已将其简化为此函数,仅使用 Q() 来模拟 return 是一个承诺的调用。

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

当我在种子打字稿项目上创建相同的函数时,此行为不会重现...

这是对 no-floating-promises 规则的投诉。根据其描述:

Creating a Promise and not storing or returning it may let other code run independently of its result. This can cause unexpected and/or non-deterministic behavior depending on external timing factors.

It’s typically better to return Promises from functions that start them, then handle them in calling code.

Use no-unused-expression in addition to this rule to reveal even more floating promises.

特别是在您的情况下,这是因为您在 .finally .catch 块之后 运行ning 代码。这被规则认为是危险的,因为如果 .finally 中的代码抛出错误,调用代码将不会处理它。

您最好的做法是 return 承诺,因此函数的 return 类型是 Promise/Q 而不是 void

提示:您可以运行 tslint -t stylishtslint -t verbose 查看规则名称及其投诉!

解决方案是在承诺调用链的末尾添加对 .done() 的调用。

据我了解done 将任何未处理的异常转换为常规未处理的异常。