Ich mache einige grundlegende asynchrone Operationen mit async/await
TypeScript, aber TSLint gibt unten mysteriöse Fehlermeldungen für diese beiden Funktionen aus. Hat jemand diese Fehler schon einmal erlebt? In der Fehlerausgabe wird die maßgebliche Regel nicht erwähnt, daher verstehe ich nicht, was diese verursacht. Irgendwelche Ideen wären sehr dankbar.
Die Hauptanfrage:
import * as rp from 'request-promise'
export function getRequest(address: rp.Options): rp.RequestPromise {
return rp(address)
}
Exportierte asynchrone Funktion:
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)
}
}
Dies wird: Promises must be handled appropriately
und await of non-Promise
für Zeile 3.
Die einfache Funktion, die diesen Export verwendet, ist:
client.on('message', message => {
if (message.content === 'green') {
getStatus(message)
}
})
Das bekommt auch Promises must be handled appropriately
.
Zusätzliche Information:
Obwohl die Fehlermeldung dies nicht erwähnt, scheint dies die maßgebliche Regel zu sein für Promises must be handled appropriately
:
https://palantir.github.io/tslint/rules/no-floating-promises/
In dieser Ausgabe wird Folgendes erwähnt await of non-Promise
:
https://github.com/palantir/tslint/issues/2661
quelle
rp
. Also habe ich folgendes verwendet:export function getRequest(address: rp.Options): rp.RequestPromise { return rp(address) }
Dies erfüllt die IDE, aber ich erhalte immer noch genau die gleichen Fehler im ersten Beitrag.Antworten:
Das ist eine beschissene Fehlermeldung. Ein besserer könnte sein,
Jeder Ausdruck vom Typ
Promise
muss mit einem Aufruf.catch
oder einem Aufruf.then
mit einem Ablehnungshandler ( Quelle ) enden .Also zum Beispiel, wenn Sie es tun
PromiseFunction() .catch(err => handle(err)) .then(() => console.log('this will succeed'))
dann wirst du immer noch ein tslint-Problem haben, weil die Art von
.then(...)
ein Versprechen ist und es mit einem Haken enden muss. Das Update würde beispielsweise eine.catch
Klausel anhängenPromiseFunction() .catch(err => handle(err)) .then(() => console.log('this will succeed')) .catch(() => 'obligatory catch')
oder deaktivieren Sie einfach tslint für diese Leitung über:
PromiseFunction() .catch(err => handle(err)) // tslint:disable-next-line:no-unsafe-any .then(() => console.log('this will succeed'))
Alternativ können Sie die Reihenfolge der Anweisungen
.then
und umkehren.catch
. Dies verhindert jedoch die.then
Ausführung von, wenn ein Fehler auftritt, den Sie vermutlich möchten, wenn Sie auf dieses Problem gestoßen sind.quelle
no-floating-promises
Regel geschrieben und bin damit einverstanden, dass die Fehlermeldung nicht großartig ist. Wenn Sie eine PR mit einer besseren Beschreibung senden möchten, bin ich alles dafür!Manchmal möchten Sie vielleicht das Versprechen anrufen, müssen aber mit der Antwort nichts anfangen. Eine Routenänderung oder etwas anderes.
also statt:
promiseFunction().then().catch() try/catch async/await
du kannst tun:
void promiseFunction();
quelle
void
Syntax zu sehenIch habe die gleiche Ausnahme bekam , wenn ich erstellt haben
firebase-function
mitfirebase-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 ); })
Dieser Code wird nicht kompiliert und
return
ERROR: /src/index.ts[22, 5]: Promises must be handled appropriately
Ich habe die Orte von
catch
und geändertthen
.Dieser Code ist Arbeit, es tut mir leid, aber ich habe keine Erklärung
So viel Erstaunliches, wenn App einen Fehler ohne
catch
Block zurückgibt, auch wennfirebase doc
nicht erwähnt, dass diescatch
erforderlich ist.quelle
Ihre
getStatus
Funktion ist so definiert, dass sie ein Versprechen zurückgibt:// All functions marked as async returns a promise: async function getStatus(message: Message) {/* ... */}
Aber Sie haben angerufen,
getStatus
ohne anzurufen, dann:Daher glaubt der Compiler, Sie hätten vergessen, Ihren asynchronen Code zu verarbeiten. Alles was Sie tun müssen, ist anzurufen
.then()
:getStatus(message).then(() => console.log('done'));
quelle
getStatus(message).then(() => console.log('done'))
immer nochPromises must be handled appropriately
..catch()
?getStatus().then().catch()
.catch()
und eintry/catch
für den AufrufgetStatus()
immer noch den gleichen Fehler wie mein erster Kommentar.Ich denke, dieses Problem kann durch Warten auf die Funktion getStatus behoben werden , da es sich um eine asynchrone Funktion handelt. Die Nachricht sagt es deutlich, aber die Zeilennummer sorgt für Verwirrung. Um ehrlich zu sein, habe ich auch einige Zeit gebraucht.
Sie können diesen Flusenfehler durch diese Codeänderung beheben:
client.on('message', message => { if (message.content === 'green') { await getStatus(message) }});
Meiner Meinung nach ist es keine gute Idee, diese spezifischen Fehler auszuschalten. Sie sind nützlich, weil Sie den Code auf andere Weise nicht asynchron ausführen würden.
quelle
await
,getStatus
würde den Faden nicht halten. Der Autor möchte die spätere Ausführung möglicherweise nicht verzögern. Dies könnte eine App unnötig aufhalten.Wenn Sie eine nichtige asynchrone Funktion mit Typoskript-Eslint schreiben, erhalten Sie eine Beschwerde, wenn Sie asynchrone Funktionen ohne Wartezeit schreiben. Dies ist besonders für die letzte Zeile der Funktion leicht zu vergessen.
const sendSyncPlayCommandToWatchers = async (): Promise<void> => { ... someAsyncFunction() }
Sie erhalten
Sie müssen das Schlüsselwort await in die letzte Zeile einfügen (oder sicherstellen, dass Sie das Versprechen mit try / catch behandeln, wie in den vorherigen Antworten erwähnt
const sendSyncPlayCommandToWatchers = async () => { ... await someAsyncFunction() }
Ich denke, dies wird auch dazu beitragen, beim Debuggen einen besseren Stack-Trace zu erhalten.
quelle