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