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);
4 Réponses :
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
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
.
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.
JS attend
:
Si la valeur de l'expression qui suit l'opérateur
wait
n'est pas unePromise
, elle est convertie en unePromise
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.
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:
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/…