javascript - O čemu bi ovo moglo biti? [TsLint pogreška: "Obećanja se moraju ispravno obraditi"]


Radim neke osnovne asinhrone operacije koristeći async/await u TypeScriptu, ali TSLint izvještava tajanstvene poruke o greškama za ove dvije funkcije ispod. Je li netko prije naišao na ove greške? U izlazu greške pravilo kojim se upravlja nije navedeno, pa ne razumijem što to uzrokuje. Bilo kakve ideje bi bile vrlo cijenjene.

Glavni zahtjev:

import * as rp from 'request-promise'

export function getRequest(address: rp.Options): rp.RequestPromise {
  return rp(address)
}

Izvezena asinkrona funkcija:

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)
  }
}

Ovo daje: Promises must be handled appropriately i await of non-Promise za liniju #3.

Jednostavna funkcija koja koristi ovaj izvoz je:

client.on('message', message => {
  if (message.content === 'green') {
    getStatus(message)
  }
})

Ovo također dobiva Promises must be handled appropriately.

Dodatne informacije:

Iako poruka o pogrešci to ne spominje, čini se da je ovo glavna pravila za Promises must be handled appropriately: https://palantir.github.io/tslint/rules/no-floating-promises/

A ovo pitanje spominje await of non-Promise: https://github.com/palantir/tslint/issues/2661

Odgovor #1

To je užasan prikaz pogreške. Bolji bi mogao biti,

svaki izraz tipa Promise mora završiti pozivom .catch ili pozivom .then s rukovateljem odbijanjem (izvor).

Dakle, na primjer, ako to učiniš

PromiseFunction()
  .catch(err => handle(err))
  .then(() => console.log('this will succeed'))

tada ćete i dalje imati problem s tslint-om, jer je tip .then(...) obećanje (promise), i mora završiti s catch. Popravak bi bio dodavanje .catch klauzule, na primjer,

PromiseFunction()
  .catch(err => handle(err))
  .then(() => console.log('this will succeed'))
  .catch(() => 'obligatory catch')

ili jednostavno onemogućavanje tslint-a za tu liniju pomoću:

PromiseFunction()
  .catch(err => handle(err))
  // tslint:disable-next-line:no-unsafe-any
  .then(() => console.log('this will succeed'))

Alternativno, mogli biste obrnuti redoslijed .then i .catch naredbi. Međutim, to sprječava izvršavanje .then ako dođe do pogreške, što vjerojatno želite ako ste naišli na ovaj problem.

Odgovor #2

Ponekad možda želite pozvati obećanje, ali ne morate ništa raditi s odgovorom. Promjena rute ili nešto drugo.

pa umjesto:

promiseFunction().then().catch()
try/catch async/await

možeš učiniti:

void promiseFunction();

Prema komentarima o pravilnoj upotrebi void molimo pročitajte: IgnoreVoid

Koristite prema vlastitoj pogodnosti :)

Povezani članci