0
votes

Détecter Javascript / ECMAScript en attente d'une utilisation abusive?

Existe-t-il un outil dans l'écosystème Javascript ou Typescript pour détecter l'utilisation (abusive / excessive) de await sur une fonction synchrone? (par exemple une règle tslint)

Le problème est survenu lorsque j'ai utilisé par erreur wait pour le résultat de la fonction synchrone,

test('Demonstrate await', async () => {
  function foo(): number { return 4; }
  const food = await foo(); // Even replace foo() with a constant or literal.
  expect(food).toBe(4);
});

que mon linter, le gts tslint par défaut, n'a pas pas attraper. Le code fonctionne bizarrement ( wait passe silencieusement les non-promesses?), Mais j'aimerais signaler l'utilisation abusive pour encourager l'utilisation d'une option asynchrone / callback.

J'avais pensé qu'une telle utilisation abusive de wait déclencherait une erreur Typescript, mais tsc et ts-jest réussissent le test suivant:

const decoded = await jsonwebtoken.verify(session, publicKey, opts);


1 commentaires

Ce n'est pas une erreur, utiliser await sur des valeurs qui ne sont pas des promesses est parfaitement légitime: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…


4 Réponses :


0
votes

Si l'expression attendue n'est pas une promesse, elle est enveloppée dans une promesse, puis attendue.

Cela signifie que vous pouvez mettre des objets, des fonctions et même des primitives et cela sera traité comme une promesse.

Modifier pour la source - consultez cette discussion ici: https://github.com/Microsoft / TypeScript / issues / 8310


2 commentaires

N'oubliez pas de créer un lien vers une ou plusieurs sources qui sauvegardent des affirmations comme celle-ci. Sinon, les gens doivent vous croire sur parole, ce qui n'est pas super.


Notez que ce n'est pas vraiment un bon lien pour sauvegarder l'affirmation selon laquelle await se comporte d'une manière spécifique: c'est juste un fil de discussion sur ce que le typographie doit faire, sans aucun lien vers des documents officiels qui expliquent comment wait doit se comporter en fonction de la spécification du mot-clé await .



0
votes

Un wait agit sur une expression. Lorsque l'expression est une promesse, l'évaluation de la fonction asynchrone s'arrête jusqu'à ce que la promesse soit résolue. Lorsque l'expression est une valeur sans promesse, elle est convertie en promesse à l'aide de Promise.resolve, puis résolue.


0 commentaires

1
votes

JS attend :

Si la valeur de l'expression qui suit l'opérateur wait n'est pas une Promise , elle est convertie en une Promise résolue.

Il n'y a donc rien de mal à cela, cela peut être utile pour les tests ou peut-être aussi dans le code en direct.


0 commentaires

2
votes

Oui, il est possible d'appliquer une règle linter comme celle-ci si vous utilisez un système de types. Pour TSlint, vous pouvez utiliser quelque chose comme ceci:

https://palantir.github.io/tslint/rules/await- promesse /


0 commentaires