[英]What could this be about? [TsLint Error: “Promises must be handled appropriately”]
我正在使用 TypeScript 中的async/await
进行一些基本的异步操作,但是 TSLint 正在为下面这两个函数抛出神秘的错误消息。 有没有人遇到过这些错误? 在错误输出中没有提到管理规则,所以我不明白是什么导致了这些。 任何想法将不胜感激。
主要要求:
import * as rp from 'request-promise'
export function getRequest(address: rp.Options): rp.RequestPromise {
return rp(address)
}
导出的异步函数:
export async function getStatus(message: Message) {
try {
const res = await getRequest(address)
if (res.ready) {
message.reply('...')
} else {
message.reply('...')
}
} catch (err) {
message.reply(err)
}
}
这得到: Promises must be handled appropriately
并await of non-Promise
第 3 行await of non-Promise
。
使用此导出的简单函数是:
client.on('message', message => {
if (message.content === 'green') {
getStatus(message)
}
})
这也让Promises must be handled appropriately
。
附加信息:
即使错误消息没有提到它,这似乎是Promises must be handled appropriately
的管理规则: https : //palantir.github.io/tslint/rules/no-floating-promises/
这个问题提到await of non-Promise
: https : //github.com/palantir/tslint/issues/2661
这是一个糟糕的错误信息。 更好的可能是,
每个Promise
类型的表达式都必须以对.catch
的调用或对.catch
的调用结束.then
并带有拒绝处理程序( source )。
所以,例如,如果你这样做
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log('this will succeed'))
那么你仍然会遇到 tslint 问题,因为 .then .then(...)
的类型是一个 promise,它必须以 catch 结束。 修复将附加一个.catch
子句,例如,
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log('this will succeed'))
.catch(() => 'obligatory catch')
或者只是通过以下方式禁用该行的 tslint:
PromiseFunction()
.catch(err => handle(err))
// tslint:disable-next-line:no-unsafe-any
.then(() => console.log('this will succeed'))
另外,你可以扭转的顺序.then
和.catch
语句。 但是,如果确实发生错误,这会阻止.then
执行,如果您遇到此问题,您可能希望这样做。
有时您可能想要调用承诺,但您不需要对响应做任何事情。 路线改变或其他什么。
所以而不是:
promiseFunction().then().catch()
try/catch async/await
你可以做:
void promiseFunction();
当我使用firebase-tool
创建firebase-function
时,我遇到了同样的异常
const ref = admin.database().ref("path/to/database/object");
ref.once("value").catch(error =>{ // line 22
response.send( error() );
}).then( snapshot =>{
response.send( snapshot.val );
})
此代码未编译并return
ERROR: /src/index.ts[22, 5]: Promises must be handled appropriately
我已经改变了catch
和then
。
ref.once(...).then(...).catch(...)
此代码有效,很抱歉,但我没有任何解释
即使根据firebase doc
没有提到需要catch
当应用程序返回一些没有catch
块的错误时,真是太神奇了。
您的getStatus
函数被定义为返回一个承诺:
// All functions marked as async returns a promise:
async function getStatus(message: Message) {/* ... */}
但是你调用了getStatus
而没有调用它,然后:
getStatus(message)
因此编译器认为您忘记处理异步代码。 您需要做的就是调用.then()
:
getStatus(message).then(() => console.log('done'));
我认为这个问题可以通过等待 getStatus 函数来解决,因为它是一个异步函数。 消息说得很清楚,但行号会引起混淆。 老实说,这也花了我一些时间。
您可以通过以下代码更改来解决此 lint 错误:
client.on('message', message => {
if (message.content === 'green') {
await getStatus(message)
}});
在我看来,关闭这些特定错误并不是一个好主意。 它们很有用,因为在另一种情况下,您不会异步运行代码。
如果您正在使用 typescript-eslint 编写 void 异步函数,如果您编写没有 await 的异步函数,您将收到投诉,很容易忘记,尤其是函数的最后一行。
const sendSyncPlayCommandToWatchers = async (): Promise<void> => {
...
someAsyncFunction()
}
你会得到
必须正确处理错误承诺@typescript-eslint/no-floating-promises
您需要将 await 关键字添加到最后一行(或者确保您按照之前的回复中提到的 try/catch 处理承诺
const sendSyncPlayCommandToWatchers = async () => {
...
await someAsyncFunction()
}
我认为这也将有助于在调试时获得更好的堆栈跟踪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.