C'est le début d'une nouvelle année, et alors que beaucoup de gens promettent d'être plus actifs, je vais vous montrer comment faire des d'être plus paresseux… s, c'est. Promise Javascript Promise Cela aura plus de sens dans un instant. https://www.youtube.com/watch?v=qj7diPVWTqY?embedable=true Tout d'abord, regardons un exemple de base de . Ici, j'ai une fonction appelée sleep qui prend un temps en millisecondes et une valeur. Il renvoie une promesse qui exécutera un pendant le nombre de millisecondes que nous devrions attendre ; puis la promesse se résout avec la valeur. Promise setTimeout /** * @template ValueType * @param {number} ms * @param {ValueType} value * @returns {Promise<ValueType>} */ function sleep(ms, value) { return new Promise((resolve) => { setTimeout(() => resolve(value), ms); }); } Cela fonctionne comme ceci : Nous pouvons attendre la fonction avec les arguments et , et après une seconde, la enregistrera la chaîne, 'Yawn & stretch'. sleep 1000 'Yawn & stretch' console Il n'y a rien de trop spécial à ce sujet. Il se comporte probablement comme vous vous en doutez, mais cela devient un peu bizarre si nous le stockons comme une variable à plus tard, plutôt que d' tout de suite la renvoyée. await await Promise const nap = sleep(1000, 'Yawn & stretch') Maintenant, disons que nous faisons un autre travail qui prend du temps (comme taper l'exemple suivant), puis la variable . await nap Vous pouvez vous attendre à un délai d'une seconde avant la résolution, mais en fait, il se résout immédiatement. Chaque fois que vous créez une , vous instanciez la fonctionnalité asynchrone dont elle est responsable. Promise Dans notre exemple, au moment où nous définissons la variable , la est créée qui exécute le . Parce que je suis un type lent, la sera résolue au moment où nous l' . nap Promise setTimeout Promise await En d'autres termes, les sont impatientes. Ils n'attendent pas que vous les . Promise await Dans certains cas, c'est une bonne chose. Dans d'autres cas, cela pourrait entraîner une utilisation inutile des ressources. Pour ces scénarios, vous voudrez peut-être quelque chose qui ressemble à une , mais qui utilise pour instancier uniquement lorsque vous en avez besoin. Promise évaluation paresseuse Avant de continuer, je veux vous montrer quelque chose d'intéressant. Les ne sont pas les seules choses qui peuvent être en JavaScript. Si nous créons un simple avec une méthode , nous pouvons en fait cet objet comme n'importe quel . Promise await Object .then() await Promise C'est un peu bizarre, mais cela nous permet également de créer différents objets qui à , mais qui n'en sont pas. Ces objets sont parfois appelés " “. ressemblent Promise Thénables Dans cet esprit, créons un nouveau appelé qui étend le constructeur intégré. L'extension de la promesse n'est pas strictement nécessaire, mais elle la fait ressembler davantage à une en utilisant des choses comme . classer LazyPromise Promise Promise instanceof class LazyPromise extends Promise { /** @param {ConstructorParameters<PromiseConstructor>[0]} executor */ constructor(executor) { super(executor); if (typeof executor !== 'function') { throw new TypeError(`LazyPromise executor is not a function`); } this._executor = executor; } then() { this.promise = this.promise || new Promise(this._executor); return this.promise.then.apply(this.promise, arguments); } } La partie sur laquelle se concentrer est la méthode . Il détourne le comportement par défaut d'une standard d'attendre que la méthode soit exécutée avant de créer une vraie . then() Promise .then() Promise Cela évite d'instancier la fonctionnalité asynchrone jusqu'à ce que vous l'appeliez réellement. Et cela fonctionne si vous appelez explicitement ou utilisez . .then() await Voyons maintenant ce qui se passe si nous remplaçons la dans la fonction d'origine par une . Encore une fois, nous assignerons le résultat à une variable . Promise sleep LazyPromise nap function sleep(ms, value) { return new LazyPromise((resolve) => { setTimeout(() => resolve(value), ms); }); } const nap = sleep(1000, 'Yawn & stretch') Ensuite, nous prenons notre temps pour taper la ligne d' et l'exécuter. await nap Cette fois, nous constatons un délai d'une seconde avant la résolution de la , quel que soit le temps écoulé depuis la création de la variable. Promise (Notez que cette implémentation ne crée la nouvelle qu'une seule fois et la référence dans les appels suivants. Donc, si nous devions l' à nouveau, elle se résoudrait immédiatement comme n'importe quelle normale) Promise await Promise Bien sûr, il s'agit d'un exemple trivial que vous ne trouverez probablement pas dans le code de production, mais de nombreux projets utilisent des objets de type évalués paresseusement. L'exemple le plus courant est probablement celui des bases de données et des constructeurs de requêtes tels que ou alors . Promise ORM Knex.js prisme Considérez le pseudo-code ci-dessous. Il s'inspire de certains de ces générateurs de requête : const query = db('user') .select('name') .limit(10) const users = await query Nous créons une requête de base de données qui va à la table et sélectionne les dix premières entrées et renvoie leurs noms. En théorie, cela fonctionnerait bien avec une régulière. "user" Promise Mais que se passe-t-il si nous voulons modifier la requête en fonction de certaines conditions telles que les paramètres de chaîne de requête ? Ce serait bien de pouvoir continuer à modifier la requête avant d'attendre finalement la . Promise const query = db('user') .select('name') .limit(10) if (orderBy) { query.orderBy(orderBy) } if (limit) { query.limit(limit) } if (id) { query.where({ id: id }) } const users = await query Si la requête de base de données d'origine était une standard, elle instancierait la requête avec impatience dès que nous aurions attribué la variable, et nous ne serions pas en mesure de la modifier ultérieurement. Promise Avec l'évaluation paresseuse, nous pouvons écrire un code comme celui-ci qui est plus facile à suivre, améliore l'expérience du développeur et n'exécute la requête qu'une seule fois lorsque nous en avons besoin. C'est un exemple où l'évaluation paresseuse est excellente. Cela peut également être utile pour des choses comme la création, la modification et l'orchestration des requêtes HTTP. Les paresseuses sont très cool pour les bons cas d'utilisation, mais cela ne veut pas dire qu'elles devraient remplacer toutes les . Dans certains cas, il est avantageux d'instancier avec impatience et d'avoir la réponse prête dès que possible. Promise Promise C'est un autre de ces scénarios "ça dépend". Mais la prochaine fois que quelqu'un vous demandera de faire une , pensez à être paresseux ( ͡° ͜ʖ ͡°). Promise Merci beaucoup d'avoir lu. Si vous avez aimé cet article, n'hésitez pas . C'est l'un des meilleurs moyens de me soutenir. Vous pouvez également ou alors si vous voulez savoir quand de nouveaux articles sont publiés. Partagez-le Inscrivez-vous à ma newsletter Suis moi sur Twitter Initialement publié le austingil.com .