繁体   English   中英

这可能是什么? [TsLint 错误:“必须适当处理 Promise”]

[英]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 appropriatelyawait 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-Promisehttps : //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

我已经改变了catchthen

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.

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