我正在使用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
and await of non-Promise
为第3行。
使用此导出的简单函数是:
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
或使用拒绝处理程序(.then
)调用source结束。
所以,例如,如果你这样做
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log('this will succeed'))
然后你仍然会有一个tslint问题,因为.then(...)
的类型是一个承诺,它必须以一个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
执行,如果遇到此问题,您可能会想要这样做。
有时你可能想要调用promise,但是你不需要对响应做任何事情。路线改变或其他。
而不是:
promiseFunction().then().catch()
try/catch async/await
你可以做:
void promiseFunction();
您的getStatus
函数被定义为返回一个承诺:
// All functions marked as async returns a promise:
async function getStatus(message: Message) {/* ... */}
但是你打电话给getStatus
而没有调用它:
getStatus(message)
因此编译器认为您忘记处理异步代码。你需要做的就是打电话给.then()
:
getStatus(message).then(() => console.log('done'));
当我使用firebase-function
创建firebase-tool
时,我有同样的例外
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(...)
这段代码很有用,很抱歉,我没有任何解释
如果应用程序返回没有catch
块的一些错误甚至根据firebase doc
没有提到catch
是必需的,那么令人惊讶。
我认为这个问题可以通过等待getStatus函数来解决,因为它是一个异步函数。消息说清楚,但行号会引起混淆。说实话,我也花了一些时间。
您可以通过以下代码更改来解决此lint错误:
client.on('message', message => {
if (message.content === 'green') {
await getStatus(message)
}});
在我看来,关闭这些特定错误并不是一个好主意。它们很有用,因为在另一种方式中,您不会运行代码异步。