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 stylish
或 tslint -t verbose
查看规则名称及其投诉!
解决方案是在承诺调用链的末尾添加对 .done()
的调用。
据我了解done
将任何未处理的异常转换为常规未处理的异常。
我从 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 stylish
或 tslint -t verbose
查看规则名称及其投诉!
解决方案是在承诺调用链的末尾添加对 .done()
的调用。
据我了解done
将任何未处理的异常转换为常规未处理的异常。