web-dev-qa-db-fra.com

Qu'est-ce que cela pourrait être? [TsLint Error: "Les promesses doivent être traitées de manière appropriée"]

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 appropriatelyet 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

18
cinnaroll45

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.

38
Warlike Chimpanzee

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();
4
T04435

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'));
4
slebetman

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.

1
Vahe Gharibyan

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.

1
Crix