J'effectue des opérations asynchrones de base à l'aide de async/await
dans TypeScript, mais TSLint génère des messages d'erreur mystérieux pour ces deux fonctions ci-dessous. Est-ce que quelqu'un a déjà rencontré ces erreurs? Sur la sortie d'erreur, la règle gouvernante n'est pas mentionnée, je ne comprends donc pas ce qui les cause. Toutes les idées seraient grandement appréciées.
La demande principale:
import * as rp from 'request-promise'
export function getRequest(address: rp.Options): rp.RequestPromise {
return rp(address)
}
Fonction asynchrone exportée:
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)
}
}
Cela donne: Promises must be handled appropriately
et await of non-Promise
pour la ligne 3.
La fonction simple qui utilise cette exportation est:
client.on('message', message => {
if (message.content === 'green') {
getStatus(message)
}
})
Cela obtient aussi Promises must be handled appropriately
.
Information additionnelle:
Même si le message d'erreur ne le mentionne pas, il semble que ce soit la règle pour Promises must be handled appropriately
: https://palantir.github.io/tslint/rules/no-floating-promises/
Et ce numéro mentionne await of non-Promise
: https://github.com/palantir/tslint/issues/2661
C'est un message d'erreur merdique. Un meilleur pourrait être,
chaque expression de type Promise
doit se terminer par un appel à .catch
ou par .then
avec un gestionnaire de rejet ( source ).
Donc, par exemple, si vous faites
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log('this will succeed'))
alors vous aurez toujours un problème de tsint, parce que le type de .then(...)
est une promesse, et il doit se terminer par une prise. Le correctif consisterait à ajouter une clause .catch
, par exemple,
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log('this will succeed'))
.catch(() => 'obligatory catch')
ou simplement désactiver tslint pour cette ligne via:
PromiseFunction()
.catch(err => handle(err))
// tslint:disable-next-line:no-unsafe-any
.then(() => console.log('this will succeed'))
Vous pouvez également inverser l'ordre des instructions .then
et .catch
. Cependant, cela empêche le .then
de s'exécuter si une erreur se produit, ce que vous voulez probablement si vous rencontriez ce problème.
Parfois, vous pouvez appeler la promesse, mais vous n'avez rien à faire avec la réponse. Un changement d'itinéraire ou autre chose.
alors au lieu de:
promiseFunction().then().catch()
try/catch async/await
tu peux faire:
void promiseFunction();
Votre fonction getStatus
est définie pour renvoyer une promesse:
// All functions marked as async returns a promise:
async function getStatus(message: Message) {/* ... */}
Mais vous avez appelé getStatus
sans appeler c'est alors:
getStatus(message)
Par conséquent, le compilateur pense que vous avez oublié de gérer votre code async. Tout ce que vous avez à faire est d'appeler .then()
:
getStatus(message).then(() => console.log('done'));
J'ai la même exception quand j'ai créé firebase-function
en utilisant 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 );
})
Ce code n'est pas compilé et return
ERROR: /src/index.ts[22, 5]: Promises must be handled appropriately
J'ai changé les lieux de catch
et then
.
ref.once(...).then(...).catch(...)
Ce code est un travail, je suis désolé mais je n'ai aucune explication
Tellement surprenant lorsque l'application renvoie l'erreur relative sans le bloc catch
même si firebase doc
n'est pas mentionné que catch
est requis.
Je pense que ce problème est réparable en attendant la fonction getStatus , puisque c'est une fonction asynchrone. Le message le dit clairement, mais le numéro de ligne est source de confusion. Pour être honnête, cela m'a aussi pris du temps.
Vous pouvez résoudre cette erreur de peluche par ce changement de code:
client.on('message', message => {
if (message.content === 'green') {
await getStatus(message)
}});
À mon avis, ce n'est pas une bonne idée de désactiver ces erreurs spécifiques. Ils sont utiles car, dans le cas contraire, vous n'exécuteriez pas le code de manière async.