繁体   English   中英

TSLint-必须使用“ finally”适当地处理承诺

[英]TSLint - Promises must be handled appropriately with `finally`

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

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

这是无浮动承诺规则的投诉。 根据其说明:

创建一个Promise而不存储或返回它可能会使其他代码独立于其结果运行。 根据外部时序因素,这可能导致意外的和/或不确定的行为。

通常最好从启动它们的函数中返回Promises,然后在调用代码中对其进行处理。

除此规则外,还要使用no-unused-expression来显示更多的浮动承诺。

具体来说,这是因为您正在.finally之后.catch块中运行代码。 规则认为这很危险,因为如果.finally的代码.finally引发错误,则调用代码将无法对其进行处理。

对您而言,最好的办法是return诺言,因此该函数的返回类型为Promise / Q而不是void

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

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

据我了解, done将所有未处理的异常转换为常规未处理的异常。

暂无
暂无

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

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