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

ホームページ ウェブフロントエンド jsチュートリアル JavaScript ジェネレーター: 一時(shí)停止機(jī)能でコードを強(qiáng)化しましょう!

JavaScript ジェネレーター: 一時(shí)停止機(jī)能でコードを強(qiáng)化しましょう!

Dec 30, 2024 pm 10:29 PM

JavaScript Generators: Supercharge Your Code with Pausing Power!

JavaScript ジェネレーターは非常に優(yōu)れています。これらは通常の機(jī)能に似ていますが、スーパーパワーが備わっています。私は最近これらを頻繁に使用していますが、コード內(nèi)の制御フローについての考え方が変わりました。

基本から始めましょう。ジェネレーターは、一時(shí)停止および再開(kāi)できる機(jī)能です。 function* 構(gòu)文と yield キーワードを使用します。簡(jiǎn)単な例を次に示します:

function* countToThree() {
  yield 1;
  yield 2;
  yield 3;
}

const counter = countToThree();
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
console.log(counter.next().value); // 3

関數(shù)を一度に 1 つの結(jié)果ずつステップ実行する方法がわかりましたか?それがジェネレーターの魔法です。

しかし、ジェネレーターは単にカウントするだけではありません。これらはカスタム反復(fù)子の作成に最適です。フィボナッチ數(shù)列を生成したいとします:

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    yield curr;
    [prev, curr] = [curr, prev + curr];
  }
}

const fib = fibonacci();
for (let i = 0; i < 10; i++) {
  console.log(fib.next().value);
}

このジェネレーターはフィボナッチ數(shù)を永遠(yuǎn)に生成し続けます。これは無(wú)限シーケンスですが、必要な値のみを計(jì)算します。

ここで、ジェネレーターの最も優(yōu)れた點(diǎn)の 1 つである遅延評(píng)価について説明します。これらは、要求された場(chǎng)合にのみ値を計(jì)算します。これは、大規(guī)模なデータセットや複雑な計(jì)算の場(chǎng)合に非常に効率的です。

より実踐的な例を見(jiàn)てみましょう。大規(guī)模なデータセット用のページネーション システムを構(gòu)築しているとします:

function* paginate(items, pageSize) {
  for (let i = 0; i < items.length; i += pageSize) {
    yield items.slice(i, i + pageSize);
  }
}

const allItems = Array.from({ length: 100 }, (_, i) => i + 1);
const pageSize = 10;
const pages = paginate(allItems, pageSize);

console.log(pages.next().value); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(pages.next().value); // [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

このジェネレーターを使用すると、すべてを一度にメモリにロードすることなく、必要に応じてデータのページをフェッチできます。

ジェネレーターは、非同期プログラミングに関しても威力を発揮します。非同期コードを同期コードのように見(jiàn)せ、動(dòng)作させることができます。 co ライブラリを使用した例を次に示します。

const co = require('co');

function* fetchUserData() {
  const user = yield fetchUser();
  const posts = yield fetchPosts(user.id);
  const comments = yield fetchComments(posts[0].id);
  return { user, posts, comments };
}

co(fetchUserData).then(result => {
  console.log(result);
}).catch(error => {
  console.error(error);
});

このコードは同期的に見(jiàn)えますが、実際には 3 つの非同期呼び出しを行っています。ジェネレーターは、Promise が解決されるまで、各利回りで一時(shí)停止します。

ジェネレーターは、共同マルチタスクにも使用できます。複數(shù)のジェネレーターを作成し、それらを切り替えて、同時(shí)実行をシミュレートできます。

function* task1() {
  yield 'Start task 1';
  yield 'Middle of task 1';
  yield 'End task 1';
}

function* task2() {
  yield 'Start task 2';
  yield 'Middle of task 2';
  yield 'End task 2';
}

function run(tasks) {
  const iterations = tasks.map(task => task());
  while (iterations.length) {
    const [first, ...rest] = iterations;
    const { value, done } = first.next();
    if (!done) {
      console.log(value);
      iterations.push(first);
    }
    iterations.unshift(...rest);
  }
}

run([task1, task2]);

このコードは 2 つのタスクを交互に実行し、一度に 1 ステップずつ実行します。

ジェネレーターはステートマシンの作成にも最適です。各収量は異なる狀態(tài)を表すことができます:

function* trafficLight() {
  while (true) {
    yield 'red';
    yield 'green';
    yield 'yellow';
  }
}

const light = trafficLight();
console.log(light.next().value); // red
console.log(light.next().value); // green
console.log(light.next().value); // yellow
console.log(light.next().value); // red

この信號(hào)機(jī)は州を無(wú)期限に循環(huán)し続けます。

ここで、より高度なテクニックについて話しましょう。ジェネレーターの委任により、別のジェネレーターに譲歩することができます:

function* innerGenerator() {
  yield 'inner 1';
  yield 'inner 2';
}

function* outerGenerator() {
  yield 'outer 1';
  yield* innerGenerator();
  yield 'outer 2';
}

const gen = outerGenerator();
console.log(gen.next().value); // outer 1
console.log(gen.next().value); // inner 1
console.log(gen.next().value); // inner 2
console.log(gen.next().value); // outer 2

yield* 構(gòu)文は innerGenerator に委譲し、そのすべての値を生成してから、outerGenerator を続行します。

ジェネレーターでのエラー処理についても言及する価値があります。 throw() メソッドを使用して、エラーをジェネレーターにスローできます。

function* errorGenerator() {
  try {
    yield 'Start';
    yield 'Middle';
    yield 'End';
  } catch (error) {
    console.error('Caught:', error);
    yield 'Error handled';
  }
}

const gen = errorGenerator();
console.log(gen.next().value); // Start
console.log(gen.throw(new Error('Oops!')).value); // Caught: Error: Oops!
                                                  // Error handled

これにより、非常に高度なエラー処理戦略が可能になります。

ジェネレーターはバックトラッキング アルゴリズムの実裝にも使用できます。以下は、項(xiàng)目の可能なすべての組み合わせを生成する簡(jiǎn)単な例です:

function* countToThree() {
  yield 1;
  yield 2;
  yield 3;
}

const counter = countToThree();
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
console.log(counter.next().value); // 3

このジェネレーターは、指定されたアイテムの 2 要素の組み合わせをすべて生成します。

ジェネレーターが真に威力を発揮する領(lǐng)域の 1 つは、大量のデータの処理です。必要なものだけを計(jì)算する効率的なデータ処理パイプラインを作成できます。これは、大きなファイルを 1 行ずつ処理する例です:

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    yield curr;
    [prev, curr] = [curr, prev + curr];
  }
}

const fib = fibonacci();
for (let i = 0; i < 10; i++) {
  console.log(fib.next().value);
}

このジェネレーターはファイルを 1 行ずつ読み取るため、巨大なファイルを完全にメモリにロードせずに処理できます。

ジェネレーターを使用して、Observable パターンを?qū)g裝することもできます。簡(jiǎn)単な実裝は次のとおりです。

function* paginate(items, pageSize) {
  for (let i = 0; i < items.length; i += pageSize) {
    yield items.slice(i, i + pageSize);
  }
}

const allItems = Array.from({ length: 100 }, (_, i) => i + 1);
const pageSize = 10;
const pages = paginate(allItems, pageSize);

console.log(pages.next().value); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(pages.next().value); // [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

このジェネレーターはオブザーバーとして機(jī)能し、受信した各データを処理します。

ジェネレーターのもう 1 つの優(yōu)れた使用法は、カスタム制御構(gòu)造を作成することです。以下は、ジェネレーターを使用した再試行関數(shù)の例です。

const co = require('co');

function* fetchUserData() {
  const user = yield fetchUser();
  const posts = yield fetchPosts(user.id);
  const comments = yield fetchComments(posts[0].id);
  return { user, posts, comments };
}

co(fetchUserData).then(result => {
  console.log(result);
}).catch(error => {
  console.error(error);
});

この再試行関數(shù)は、指定された関數(shù)を最大 maxAttempts 回試行してから、あきらめます。

結(jié)論として、ジェネレーターは、より表現(xiàn)力豊かで効率的で保守しやすいコードを作成するのに役立つ JavaScript の強(qiáng)力な機(jī)能です。これらは、複雑な制御フローの処理、非同期操作の管理、大規(guī)模なデータセットの処理に最適です。最初は少し奇妙に思えるかもしれませんが、コツを摑めば、プロジェクトでそれらを使用するあらゆる種類の創(chuàng)造的な方法が見(jiàn)つかるでしょう。それでは、次の JavaScript プロジェクトでジェネレーターを試してみてください。コードがどれほど簡(jiǎn)素化されるかに驚くかもしれません!


私たちの作品

私たちの作品をぜひチェックしてください:

インベスターセントラル | スマートな暮らし | エポックとエコー | 不可解な謎 | ヒンドゥーヴァ | エリート開(kāi)発者 | JS スクール


私たちは中程度です

Tech Koala Insights | エポックズ&エコーズワールド | インベスター?セントラル?メディア | 不可解な謎 中 | 科學(xué)とエポックミディアム | 現(xiàn)代ヒンドゥーヴァ

以上がJavaScript ジェネレーター: 一時(shí)停止機(jī)能でコードを強(qiáng)化しましょう!の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java vs. JavaScript:混亂を解消します Java vs. JavaScript:混亂を解消します Jun 20, 2025 am 12:27 AM

JavaとJavaScriptは異なるプログラミング言語(yǔ)であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開(kāi)発に使用されますが、JavaScriptは主にWebページ開(kāi)発に使用されます。

JavaScriptコメント:短い説明 JavaScriptコメント:短い説明 Jun 19, 2025 am 12:40 AM

JavaScriptcommentsEareEssentialential-formaining、およびGuidingCodeexecution.1)single-linecommentseared forquickexplanations.2)多LinecommentsexplaincomplexlogiCorprovidededocumentation.3)clarifyspartsofcode.bestpractic

JSで日付と時(shí)間を操作する方法は? JSで日付と時(shí)間を操作する方法は? Jul 01, 2025 am 01:27 AM

JavaScriptで日付と時(shí)間を処理する場(chǎng)合は、次の點(diǎn)に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお?jiǎng)幛幛筏蓼埂?2。時(shí)間情報(bào)を取得および設(shè)定して、メソッドを設(shè)定でき、月は0から始まることに注意してください。 3.手動(dòng)でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお?jiǎng)幛幛筏蓼?。これらの重要なポイントを?xí)得すると、一般的な間違いを効果的に回避できます。

JavaScript vs. Java:開(kāi)発者向けの包括的な比較 JavaScript vs. Java:開(kāi)発者向けの包括的な比較 Jun 20, 2025 am 12:21 AM

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

なぜの下部にタグを配置する必要があるのですか? なぜの下部にタグを配置する必要があるのですか? Jul 02, 2025 am 01:22 AM

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScript:効率的なコーディングのためのデータ型の調(diào)査 JavaScript:効率的なコーディングのためのデータ型の調(diào)査 Jun 20, 2025 am 12:46 AM

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

DOMでのイベントの泡立ちとキャプチャとは何ですか? DOMでのイベントの泡立ちとキャプチャとは何ですか? Jul 02, 2025 am 01:19 AM

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設(shè)定することにより実裝されます。 2。イベントバブルはデフォルトの動(dòng)作であり、UseCaptureはfalseに設(shè)定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動(dòng)的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaとJavaScriptの違いは何ですか? JavaとJavaScriptの違いは何ですか? Jun 17, 2025 am 09:17 AM

JavaとJavaScriptは、異なるプログラミング言語(yǔ)です。 1.Javaは、エンタープライズアプリケーションや大規(guī)模なシステムに適した、靜的に型付けされ、コンパイルされた言語(yǔ)です。 2。JavaScriptは動(dòng)的なタイプと解釈された言語(yǔ)であり、主にWebインタラクションとフロントエンド開(kāi)発に使用されます。

See all articles