国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison interface Web js tutoriel Comment utiliser les méthodes Generator en JavaScript

Comment utiliser les méthodes Generator en JavaScript

Jun 14, 2018 pm 04:08 PM
js

Generator est une syntaxe très puissante, mais elle n'est pas largement utilisée. Cet article présente principalement comment utiliser Generator en JavaScript. Les amis qui en ont besoin peuvent se référer à

Generator est une syntaxe très puissante, mais son utilisation n'est pas largement utilisée (voir l'enquête sur twitter ci-dessous ! ). Pourquoi est-ce ainsi ? Par rapport à async/await, son utilisation est plus compliquée et le débogage n'est pas facile (la plupart des cas reviennent au passé. Même si nous pouvons obtenir une expérience similaire de manière très simple, les gens préfèrent généralement async/await .

Cependant, Generator nous permet de parcourir notre propre code via le mot-clé rendement ! C'est une syntaxe super puissante et nous pouvons réellement manipuler l'exécution ! En commen?ant par les opérations d'annulation les moins évidentes, commen?ons par les opérations de synchronisation.

J'ai créé un référentiel de code pour les fonctionnalités mentionnées dans l'article - github.com/Bloomca/obs…

Batch (ou Schedule)

L'exécution de la fonction Générateur renverra un objet traverseur, ce qui signifie que nous pouvons le parcourir de manière synchrone. Pourquoi voulons-nous faire cela ? La raison peut être la mise en ?uvre d'un traitement par lots. Imaginez que nous devions télécharger 1 000 éléments et les afficher ligne par ligne dans un tableau (ne me demandez pas pourquoi, en supposant que nous n'utilisons pas de framework). Bien qu'il n'y ait rien de mal à les montrer tout de suite, ce n'est parfois pas la meilleure solution - peut-être que votre MacBook Pro peut le gérer facilement, mais l'ordinateur d'une personne moyenne ne le peut pas (et encore moins un téléphone). Cela signifie donc que nous devons retarder l’exécution d’une manière ou d’une autre.

Veuillez noter que cet exemple concerne l'optimisation des performances, il n'est pas nécessaire de le faire jusqu'à ce que vous rencontriez ce problème - une optimisation prématurée est la racine de tous les maux

// 最初的同步實(shí)現(xiàn)版本
function renderItems(items) {
 for (item of items) {
 renderItem(item);
 }
}
// 函數(shù)將由我們的執(zhí)行器遍歷執(zhí)行
// 實(shí)際上,我們可以用相同的同步方式來執(zhí)行它!
function* renderItems(items) {
 // 我使用 for..of 遍歷方法來避免新函數(shù)的產(chǎn)生
 for (item of items) {
 yield renderItem(item);
 }
}

ne fait aucune différence?! Droite? Eh bien, la différence ici est que nous pouvons désormais exécuter cette fonction différemment sans changer le code source. En fait, comme je l’ai déjà mentionné, il n’est pas nécessaire d’attendre, nous pouvons le faire de manière synchrone. Alors, modifions notre code. Que diriez-vous d'ajouter un délai de 4 ms (un battement de c?ur dans la VM JavaScript) après chaque rendement?? Nous avons 1000 éléments et le rendu prendra 4 secondes - pas mal, en supposant que je veuille effectuer un rendu en 2 secondes, la fa?on la plus simple d'y penser est d'en rendre 2 à la fois. Du coup, la solution utilisant Promises devient plus compliquée - nous devons passer un autre paramètre : le nombre d'éléments à restituer à chaque fois. Via notre exécuteur, nous devons toujours passer ce paramètre, mais l'avantage est qu'il n'a absolument aucun effet sur notre méthode renderItems.

function runWithBatch(chunk, fn, ...args) {
 const gen = fn(...args);
 let num = 0;
 return new Promise((resolve, promiseReject) => {
 callNextStep();
 function callNextStep(res) {
  let result;
  try {
  result = gen.next(res);
  } catch (e) {
  return reject(e);
  }
  next(result);
 }
 function next({ done, value }) {
  if (done) {
  return resolve(value);
  }
  // every chunk we sleep for a tick
  if (num++ % chunk === 0) {
  return sleep(4).then(proceed);
  } else {
  return proceed();
  }
  function proceed() {
  return callNextStep(value);
  }
 }
 });
}
// 第一個(gè)參數(shù) —— 每批處理多少個(gè)項(xiàng)目
const items = [...];
batchRunner(2, function*() {
 for (item of items) {
 yield renderItem(item);
 }
});

Comme vous pouvez le constater, nous pouvons facilement modifier le nombre d'éléments par lot, quel que soit l'exécuteur, et revenir à une exécution synchrone normale - le tout sans affecter la méthode renderItems.

Annuler

Considérons la fonction traditionnelle - Annuler. J'en ai parlé en détail dans mon article Annulation des promesses en général (Traduction : Comment annuler sa Promesse ?). Je vais donc utiliser une partie de ce code?:

function runWithCancel(fn, ...args) {
 const gen = fn(...args);
 let cancelled, cancel;
 const promise = new Promise((resolve, promiseReject) => {
 // define cancel function to return it from our fn
 // 定義 cancel 方法,并返回它
 cancel = () => {
  cancelled = true;
  reject({ reason: 'cancelled' });
 };
 onFulfilled();
 function onFulfilled(res) {
  if (!cancelled) {
  let result;
  try {
   result = gen.next(res);
  } catch (e) {
   return reject(e);
  }
  next(result);
  return null;
  }
 }
 function onRejected(err) {
  var result;
  try {
  result = gen.throw(err);
  } catch (e) {
  return reject(e);
  }
  next(result);
 }
 function next({ done, value }) {
  if (done) {
  return resolve(value);
  }
  // 假設(shè)我們總是接收 Promise,所以不需要檢查類型
  return value.then(onFulfilled, onRejected);
 }
 });
 return { promise, cancel };
}

La meilleure partie ici est que nous pouvons annuler toutes les requêtes qui n'ont pas encore eu la chance de s'exécuter (nous pouvons également passer un paramètre d'objet comme AbortController à notre exécuteur, vous pouvez donc même annuler la requête en cours?! ), et nous n’avons pas modifié une seule ligne de code dans notre logique métier.

Pause/Reprise

Un autre besoin particulier peut être la fonctionnalité pause/reprise. Pourquoi voulez-vous cette fonctionnalité?? Imaginez que nous rendions 1 000 lignes de données, et que c'est très lent, et que nous voulons donner à l'utilisateur la possibilité de suspendre/reprendre le rendu afin qu'il puisse arrêter tout le travail en arrière-plan et lire ce qui a été téléchargé. Commen?ons?!

// 實(shí)現(xiàn)渲染的方法還是一樣的
function* renderItems() {
 for (item of items) {
 yield renderItem(item);
 }
}
function runWithPause(genFn, ...args) {
 let pausePromiseResolve = null;
 let pausePromise;
 const gen = genFn(...args);
 const promise = new Promise((resolve, reject) => {
 onFulfilledWithPromise();
 function onFulfilledWithPromise(res) {
  if (pausePromise) {
  pausePromise.then(() => onFulfilled(res));
  } else {
  onFulfilled(res);
  }
 }
 function onFulfilled(res) {
  let result;
  try {
  result = gen.next(res);
  } catch (e) {
  return reject(e);
  }
  next(result);
  return null;
 }
 function onRejected(err) {
  var result;
  try {
  result = gen.throw(err);
  } catch (e) {
  return reject(e);
  }
  next(result);
 }
 function next({ done, value }) {
  if (done) {
  return resolve(value);
  }
  // 假設(shè)我們總是接收 Promise,所以不需要檢查類型
  return value.then(onFulfilledWithPromise, onRejected);
 }
 });
 return {
 pause: () => {
  pausePromise = new Promise(resolve => {
  pausePromiseResolve = resolve;
  });
 },
 resume: () => {
  pausePromiseResolve();
  pausePromise = null;
 },
 promise
 };
}

Appeler cet exécuteur peut nous renvoyer un objet avec des fonctions pause/reprise, qui peuvent toutes être facilement obtenues, ou utiliser notre code métier précédent?! Donc, si vous avez beaucoup de cha?nes de requêtes ? lourdes ? qui prennent beaucoup de temps et que vous souhaitez fournir une fonctionnalité pause/reprise à vos utilisateurs, n'hésitez pas à implémenter cet exécuteur dans votre code.

Gestion des erreurs

我們有個(gè)神秘的 onRejected 調(diào)用,這是我們這部分談?wù)摰闹黝}。如果我們使用正常的 async/await 或 Promise 鏈?zhǔn)綄懛?,我們將通過 try/catch 語句來進(jìn)行錯(cuò)誤處理,如果不添加大量的邏輯代碼就很難進(jìn)行錯(cuò)誤處理。通常情況下,如果我們需要以某種方式處理錯(cuò)誤(比如重試),我們只是在 Promise 內(nèi)部進(jìn)行處理,這將會(huì)回調(diào)自己,可能再次回到同樣的點(diǎn)。而且,這還不是一個(gè)通用的解決方案 —— 可悲的是,在這里甚至 Generator 也不能幫助我們。我們發(fā)現(xiàn)了 Generator 的局限 —— 雖然我們可以控制執(zhí)行流程,但不能移動(dòng) Generator 函數(shù)的主體;所以我們不能后退一步,重新執(zhí)行我們的命令。一個(gè)可行的解決方案是使用command pattern, 它告訴了我們 yield 結(jié)果的數(shù)據(jù)結(jié)構(gòu) —— 應(yīng)該是我們需要執(zhí)行此命令需要的所有信息,這樣我們就可以再次執(zhí)行它了。所以,我們的方法需要改為:

function* renderItems() {
 for (item of items) {
 // 我們需要將所有東西傳遞出去:
 // 方法, 內(nèi)容, 參數(shù)
 yield [renderItem, null, item];
 }
}

正如你所看到的,這使得我們不清楚發(fā)生了什么 —— 所以,也許最好是寫一些 wrapWithRetry 方法,它會(huì)檢查 catch 代碼塊中的錯(cuò)誤類型并再次嘗試。但是我們?nèi)匀豢梢宰鲆恍┎挥绊懳覀児δ艿氖虑?。例如,我們可以增加一個(gè)關(guān)于忽略錯(cuò)誤的策略 —— 在 async/await 中我們不得不使用 try/catch 包裝每個(gè)調(diào)用,或者添加空的 .catch(() => {}) 部分。有了 Generator,我們可以寫一個(gè)執(zhí)行器,忽略所有的錯(cuò)誤。

function runWithIgnore(fn, ...args) {
 const gen = fn(...args);
 return new Promise((resolve, promiseReject) => {
 onFulfilled();
 function onFulfilled(res) {
  proceed({ data: res });
 }
 // 這些是 yield 返回的錯(cuò)誤
 // 我們想忽略它們
 // 所以我們像往常一樣做,但不去傳遞出錯(cuò)誤
 function onRejected(error) {
  proceed({ error });
 }
 function proceed(data) {
  let result;
  try {
  result = gen.next(data);
  } catch (e) {
  // 這些錯(cuò)誤是同步錯(cuò)誤(比如 TypeError 等)
  return reject(e);
  }
  // 為了區(qū)分錯(cuò)誤和正常的結(jié)果
  // 我們用它來執(zhí)行
  next(result);
 }
 function next({ done, value }) {
  if (done) {
  return resolve(value);
  }
  // 假設(shè)我們總是接收 Promise,所以不需要檢查類型
  return value.then(onFulfilled, onRejected);
 }
 });
}

關(guān)于 async/await

Async/await 是現(xiàn)在的首選語法(甚至 co 也談到了它 ),這也是未來。但是,Generator 也在 ECMAScript 標(biāo)準(zhǔn)內(nèi),這意味著為了使用它們,除了寫幾個(gè)工具函數(shù),你不需要任何東西。我試圖向你們展示一些不那么簡單的例子,這些實(shí)例的價(jià)值取決于你的看法。請記住,沒有那么多人熟悉 Generator,并且如果在整個(gè)代碼庫中只有一個(gè)地方使用它們,那么使用 Promise 可能會(huì)更容易一些 —— 但是另一方面,通過 Generator 某些問題可以被優(yōu)雅和簡潔的處理。

上面是我整理給大家的,希望今后會(huì)對大家有幫助。

相關(guān)文章:

在JS中實(shí)現(xiàn)點(diǎn)擊下拉菜單內(nèi)容同步輸入框

在vue中使用cli如何實(shí)現(xiàn)重構(gòu)多頁面腳手架

在JS中如何實(shí)現(xiàn)通過拖拽改變物體大小

在JS中如何改變單物體透明度

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Comment créer un graphique en chandeliers boursiers en utilisant PHP et JS Comment créer un graphique en chandeliers boursiers en utilisant PHP et JS Dec 17, 2023 am 08:08 AM

Comment utiliser PHP et JS pour créer un graphique en bougies boursières. Un graphique en bougies boursières est un graphique d'analyse technique courant sur le marché boursier. Il aide les investisseurs à comprendre les actions de manière plus intuitive en dessinant des données telles que le prix d'ouverture, le prix de cl?ture, le prix le plus élevé et le prix le plus élevé. prix le plus bas des fluctuations du prix des actions. Cet article vous apprendra comment créer des graphiques en bougies boursières en utilisant PHP et JS, avec des exemples de code spécifiques. 1. Préparation Avant de commencer, nous devons préparer l'environnement suivant : 1. Un serveur exécutant PHP 2. Un navigateur prenant en charge HTML5 et Canvas 3.

Recommandé?: Excellent projet de détection et de reconnaissance des visages open source JS Recommandé?: Excellent projet de détection et de reconnaissance des visages open source JS Apr 03, 2024 am 11:55 AM

La technologie de détection et de reconnaissance des visages est déjà une technologie relativement mature et largement utilisée. Actuellement, le langage d'application Internet le plus utilisé est JS. La mise en ?uvre de la détection et de la reconnaissance faciale sur le front-end Web présente des avantages et des inconvénients par rapport à la reconnaissance faciale back-end. Les avantages incluent la réduction de l'interaction réseau et de la reconnaissance en temps réel, ce qui réduit considérablement le temps d'attente des utilisateurs et améliore l'expérience utilisateur. Les inconvénients sont les suivants?: il est limité par la taille du modèle et la précision est également limitée?; Comment utiliser js pour implémenter la détection de visage sur le web ? Afin de mettre en ?uvre la reconnaissance faciale sur le Web, vous devez être familier avec les langages et technologies de programmation associés, tels que JavaScript, HTML, CSS, WebRTC, etc. Dans le même temps, vous devez également ma?triser les technologies pertinentes de vision par ordinateur et d’intelligence artificielle. Il convient de noter qu'en raison de la conception du c?té Web

Outils essentiels pour l'analyse boursière?: découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Outils essentiels pour l'analyse boursière?: découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Dec 17, 2023 pm 06:55 PM

Outils essentiels pour l'analyse boursière?: découvrez les étapes pour dessiner des graphiques en bougies en PHP et JS. Des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet et de la technologie, le trading d'actions est devenu l'un des moyens importants pour de nombreux investisseurs. L'analyse boursière est une partie importante de la prise de décision des investisseurs, et les graphiques en bougies sont largement utilisés dans l'analyse technique. Apprendre à dessiner des graphiques en bougies à l'aide de PHP et JS fournira aux investisseurs des informations plus intuitives pour les aider à prendre de meilleures décisions. Un graphique en chandeliers est un graphique technique qui affiche les cours des actions sous forme de chandeliers. Il montre le cours de l'action

Comment utiliser JS et Baidu Maps pour implémenter la fonction Map Pan Comment utiliser JS et Baidu Maps pour implémenter la fonction Map Pan Nov 21, 2023 am 10:00 AM

Comment utiliser JS et Baidu Map pour implémenter la fonction de panoramique de la carte Baidu Map est une plate-forme de services cartographiques largement utilisée, souvent utilisée pour afficher des informations géographiques, le positionnement et d'autres fonctions dans le développement Web. Cet article explique comment utiliser JS et l'API Baidu Map pour implémenter la fonction de panoramique de la carte et fournit des exemples de code spécifiques. 1. Préparation Avant d'utiliser l'API Baidu Map, vous devez d'abord demander un compte de développeur sur Baidu Map Open Platform (http://lbsyun.baidu.com/) et créer une application. Création terminée

Comment utiliser JS et Baidu Maps pour implémenter la fonction de carte thermique de carte Comment utiliser JS et Baidu Maps pour implémenter la fonction de carte thermique de carte Nov 21, 2023 am 09:33 AM

Comment utiliser JS et Baidu Maps pour implémenter la fonction de carte thermique de carte Introduction : Avec le développement rapide d'Internet et des appareils mobiles, les cartes sont devenues un scénario d'application courant. En tant que méthode d'affichage visuel, les cartes thermiques peuvent nous aider à comprendre la distribution des données de manière plus intuitive. Cet article explique comment utiliser JS et l'API Baidu Map pour implémenter la fonction de carte thermique de carte et fournit des exemples de code spécifiques. Travail de préparation : Avant de commencer, vous devez préparer les éléments suivants : un compte développeur Baidu, créer une application et obtenir l'AP correspondant

Comment utiliser JS et Baidu Map pour implémenter la fonction de traitement des événements de clic sur la carte Comment utiliser JS et Baidu Map pour implémenter la fonction de traitement des événements de clic sur la carte Nov 21, 2023 am 11:11 AM

Présentation de la fa?on d'utiliser JS et Baidu Maps pour implémenter les fonctions de traitement des événements de clic sur la carte?: dans le développement Web, il est souvent nécessaire d'utiliser des fonctions de carte pour afficher la localisation géographique et les informations géographiques. Le traitement des événements de clic sur la carte est une partie couramment utilisée et importante de la fonction de carte. Cet article explique comment utiliser JS et l'API Baidu Map pour implémenter la fonction de traitement des événements de clic de la carte et donne des exemples de code spécifiques. étapes?: Importez le fichier API de Baidu Map. Tout d’abord, importez le fichier de l’API Baidu Map dans le fichier HTML. Cela peut être réalisé via le code suivant?:

Conseils de développement PHP et JS?: ma?trisez la méthode de création de graphiques en bougies boursières Conseils de développement PHP et JS?: ma?trisez la méthode de création de graphiques en bougies boursières Dec 18, 2023 pm 03:39 PM

Avec le développement rapide de la finance sur Internet, l'investissement en actions est devenu le choix de plus en plus de personnes. Dans le trading d'actions, les graphiques en bougies sont une méthode d'analyse technique couramment utilisée. Ils peuvent montrer l'évolution des cours des actions et aider les investisseurs à prendre des décisions plus précises. Cet article présentera les compétences de développement de PHP et JS, amènera les lecteurs à comprendre comment dessiner des graphiques en bougies boursières et fournira des exemples de code spécifiques. 1. Comprendre les graphiques en bougies boursières Avant de présenter comment dessiner des graphiques en bougies boursières, nous devons d'abord comprendre ce qu'est un graphique en bougies. Les graphiques en chandeliers ont été développés par les Japonais

La relation entre js et vue La relation entre js et vue Mar 11, 2024 pm 05:21 PM

La relation entre js et vue : 1. JS comme pierre angulaire du développement Web ; 2. L'essor de Vue.js en tant que framework front-end ; 3. La relation complémentaire entre JS et Vue ; Vue.

See all articles