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

时间:2018-11-26 06:48:49

标签: typescript q tslint

我从TSLint收到此错误,并且试图了解为什么它在抱怨。

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

我已将其简化为此函数,仅使用String labelToSearch = "a"; List<Map<String, Object>> filtered = result.stream() .filter(m -> labelToSearch.equals(m.get("label"))) .collect(Collectors.toList()); 模拟返回承诺的调用。

Q()

现在我在项目上运行export function DoSomethingAsync(): void { Q().then(r => { console.log('test'); }).catch(err => { log.error("wow"); }).finally(() => { log.info("at finally") }); } 时,出现以下错误:

错误:C:/dev/local_cache_service.ts [31,5]:必须正确处理承诺

如果我删除了tslint通话,tslint通行证将没有错误。

finally

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

2 个答案:

答案 0 :(得分:4)

这是来自no-floating-promises规则的投诉。根据其说明:

  

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

     

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

     

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

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

您最好要做的是return,因此函数的返回类型是Promise / Q而不是void

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

答案 1 :(得分:0)

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

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

相关问题