警告
このパッケージを依存関係としてインストールしないでください! (参照:開始)
現在、約束はJavaScriptの非同期タスクを処理するための事実上の方法であり、そのため、それらはJavaScript開発者の知識の基本的な部分です。
しかし、私たちが初めて約束を学んでいるとき、私たちは十分に学ぶことができるだけです。つまり、 Promise.all (最近では、おそらくasync/awaitのみである可能性が高い)の使用方法を少し学びます。
このアプローチは初心者にとっては理にかなっていますが、日常生活のほとんどの問題を解決するのに十分であるため、繰り返される問題は、彼らがそこに止まることです。つまり、この最初の知識を乗り越えることはありません。
そして、より複雑な問題を解決するにはより深い理解が必要であるため、これはまさに多くの開発者を現在のレベルで保持する姿勢を「十分に学ぶ」姿勢です。
したがって、開発者のスキルを次のレベルに引き上げたい場合、浅い水域で泳ぐことはそれを削減し、より深く、約束を完全に理解する必要があり、それらがどのように働くか、彼らasync/awaitように機能するthen/catch 、あなたは最も効率的な方法で非同期のタスクを調整することができます。
また、約束は最終的に非同期タスクを処理するための抽象化であるため、非同期プログラミングに関連する一般的な問題に取り組むことは必須です。
それを念頭に置いて、このプロジェクトを正確に作成して、この深い約束と非同期プログラミングに深く掘り下げるのを支援します。
これらのトピックを取り巻く説明と実践的な演習の両方を提供することにより、このプロジェクトは、それらを習得するためのこの旅であなたの仲間になることを目指しています。
あなたがすでにベテランの開発者であっても、たとえば、 concrete/parallelMaxConcurrency 、 concrete/concurrencyOverride 、コンクリート/ concrete/extractingResolvers物の解体、および/foundation/promiseいくつかの興味深い課題とするように、1つまたは2つのことを学ぶかもしれません。
重要
このプロジェクトは、約束を学んでいる人々を初めて意図していません。これは、少なくとも約束、それらが何を表しているか、そしてそれらをどのように使用するかをasync/awaitとthen/catchで使用する方法についての基本的な知識を持っていると想定しているためです。
警告
注意:このリポジトリは、エンドユーザーであれば貢献していない限り、クローン化されることを意図していません。以下の手順に従ってください
まず、プロジェクトをインストールするには、実行してください。
npm create promises-training@latest注記
このプロジェクトは運動駆動型であるため、主な目標はそれらを解決することです。
時には、何をする必要があるかを理解するのに役立つ演習とともに説明があります。また、問題が解決されることについてのいくつかの文脈もあります。
演習は3つのカテゴリに分かれています。
重要
カテゴリには特定の順序はありません。他のカテゴリを完全に完成させる前であっても、カテゴリのいずれかから始めて別のカテゴリに切り替えることができます。ただし、エクササイズには、次に説明するレベルが異なります。
エクササイズはsrc/exercises/<category>フォルダー内にあり、 <category>は上記のカテゴリの1つです。
グラフエクササイズの場合、基本的な説明はこのREADME、グラフセクションにあり、各エクササイズには、その特定の演習の依存性グラフを描写するgraph.pngがあります。
コンクリートと基礎の演習の場合、説明は演習のフォルダー内のREADME.mdにあります(例: src/exercises/concrete/parallelChunks/README.md )。
演習を解決するには、 src/exercises/<category>/<exercise>/exercise.tsファイルを編集する必要があります。
エクササイズを解決した後、実行してソリューションを確認できます。
npm run check < category > / < exercise >テストはsrc/tests内にあります。
一般に、テストは実装を見ずに何が間違っていたかを正確に伝える方法で考案されているため、エクササイズフォルダー内でのみ作業しますが、何らかの理由で立ち往生したり好奇心が強い場合は、それらを覗くことができます。
src/libフォルダーは内部使用のみを目的としているため、気にしないでください。
また、インストールを将来のバージョンと互換性のあるものにするために、 src/exercisesフォルダーの外側のファイルを変更しないでください。
カテゴリに加えて、エクササイズはレベルに分割され、レベルを進むにつれてエクササイズが困難が増加します。
3つのレベルがあります:
この分類はやや主観的であるため、YMMVであり、次のレベルに移動するためにすべてのエクササイズをレベルで完了する必要はありません。
注記
あなたが見ることができるように、現在、それほど多くの高度なエクササイズはありませんが、アイデアは、新しいエクササイズが時間とともに追加されるということです。
各エクササイズには、ソリューションを確認できるように、自動テストが伴います。
単一のエクササイズのテストを実行するには、実行してください。
npm run check < category > / < exercise >たとえば、 parallelChunksエクササイズのテストを実行するには、実行してください。
npm run check concrete/parallelChunksまたは、グラフ演習番号2を実行するには、実行します。
npm run check graph/2/test.test.ts注記
前の例では、 /test.test.tsエクササイズのファイルに追加する必要がありました。そうしないと、2から29のエクササイズなど、 2から始まる他のグラフエクササイズでも実行されます。
Vitestをテストランナーとして使用するため、CLIオプションはすべて利用できます。
また、グラフエクササイズには、グラフ自体から自動的に生成されるという意味で、グラフエクササイズにはいくつかの特異性があり、そのため、一部のエクササイズには膨大な数のテストがあります(一部の演習では100Kを超えるテストがあります)。
もちろん、それらのすべてを非常に遅くするため、それらのすべてを実行するわけではないため、それらのサブセットのみを実行するだけで、実行されるテストの数とサブセットも調整することができます。
詳細については、グラフ演習セクションをご覧ください。
現在、3つの演習カテゴリがあります。
非同期タスクに対処することの大部分は、各タスクができるだけ早く開始され、これらのタスクを適切に調整するために、それらの間の依存関係を理解するために必要なことです。
このカテゴリでは、各エクササイズに依存関係グラフが表示され、グラフのタスクを可能な限り最も効率的に調整します。
演習はオーケストレーション自体に焦点を当てているため、タスクはcreatePromise(label)を呼び出すことによって作成されます。 labelタスクを識別する文字列です。
たとえば、このグラフを取ります。

このグラフには2つのタスク、 AとBがあり、 BはAに依存します。これは、 Bから出てくる矢印で表され、 Aを指します。
これは、 B Aが終了した後にのみ開始できることを意味し、他のタスクに依存しないため、 Aすぐに開始できます。
したがって、このグラフの最も効率的な実装は次のとおりです。
await createPromise ( "A" ) ;
await createPromise ( "B" ) ;タスクは複数のタスクに依存することもあります。

このグラフでは、 C AとB両方に依存するため、 AとB両方が終了した後にのみ開始できます。
ただし、 AとBの両方が他のタスクに依存しないため、すぐに開始できます。
このグラフの最も効率的な実装は次のとおりです。
await Promise . all ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;タスクには、セットのいずれかが満たされている場合、タスクを開始できます。

このグラフでは、 C AまたはBに依存します。これは、依存関係セットごとに異なる色を使用することで表されます。色自体には特定の意味がありません。このように使用されるため、依存関係は互いに区別されます。
したがって、 CがAまたはB終了するとすぐにCを開始できます。
await Promise . any ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;最後になりましたが、約束には2つの可能な結果があります。それらを満たすか拒否することができます。

このグラフには、タスクBがあります。タスクBは、 AのフルフィルメントとタスクCに依存します。タスクCは、 Aに依存します。
重要
破線のエッジは、約束の拒絶を表すために使用されます。
これは、 B Aが満たされた後にのみ開始でき、 C A拒否された後にのみ開始できることを意味します。
これらの結果の1つだけが可能であるため、 BまたはCのいずれかが実行されます。
対応する実装:
try {
await createPromise ( "A" ) ;
try {
await createPromise ( "B" ) ;
} catch { }
} catch {
await createPromise ( "C" ) ;
}グラフエクササイズを行うと、3つの機能がエクスポートされていることがわかります: mixed 、 asyncAwait 、 thenCatch 。
アイデアは、3つの異なる実装を提供することです。
mixed :これは完全に無料です。非同期/待ち声とその後/キャッチの両方を混ぜることができます。asyncAwait :これでは、async/awaitを使用する必要がありますthenCatch :これでは、/catchのみを使用する必要があります。これにより、両方のスタイルの約束の取り扱いに熟練することになります。
また、ファイルの最後に、エクスポートがskipExerciseに包まれていることに気付くでしょう。これにより、その特定の実装のテストがスキップされ、出力が散らばらないようになります。
これら3つのそれぞれにソリューションを実装するときは、テストを実行する実装のskipExercise Callを削除します。たとえば、既にmixedソリューションを実装している場合は、 skipExerciseを削除しますが、実装するまでasyncAwaitとthenCatch用のSkipexerciseを削除してください。
グラフエクササイズの実装のデバッグを支援するために、異なる実行「パス」をシミュレートできるようにするUIを作成しました。
UIを開くには、実行してください。
npm run graph:uiUIはWebアプリとして提供されており、このように見えます。

それでは、各セクションを調べてみましょう。

左側のサイドバーを使用すると、デバッグするエクササイズを選択できます。

このトップセクションでは、デバッグする実装を選択できます。

右側のサイドバーを使用すると、約束を解決/拒否することにより、エクササイズの実行フローを制御できます。
約束が作成されると、新しいエントリがサイドバーに追加されます。

センターのこのセクションでは、各ステップで作成および解決/拒否された約束の記録を示しています。

下部のこのセクションは、各ステップで解決/拒否された約束の要約を順番に示しています。
グラフエクササイズはグラフ(DUH)に基づいているため、特定のエクササイズのすべての可能なテストを自動的に生成することが可能です。
想像するかもしれないように、生成されたテストの数は時々巨大であるため、実行されるテストの最大数に上限があります。
また、バイアスを防ぐために、生成された順序でテストを実行しません。代わりに、それらをシャッフルします。
このシャッフルは、テストが最初に生成された直後に行われるため、テストは決定論的であり、つまり、グラフエクササイズテストを実行するたびに、同じテストのサブセットを実行します。
ただし、実行されるテストのキャップとサブセットの両方を調整することができます。
キャップを微調整するには、 npm run graph:setGraphTestsCap <number>を実行できます。
たとえば、キャップを10000に設定するには、実行してください。
npm run graph:setGraphTestsCap 10000実行されるテストのサブセットを調整するには、 npm run graph:shuffleGraphTestData <graph-exercise-number>を実行できます。これにより、指定されたグラフ演習のテストが変更されます。
たとえば、グラフ演習番号2のテストを再シャッフルするには、実行します。
npm run graph:shuffleGraphTestData 2グラフエクササイズは、タスク間の依存関係を理解するのに最適ですが、コンパイル時間で依存関係が既知で固定されているタスクのみがグラフで表すことができるため、可能なシナリオの全範囲をカバーするものではありません。
したがって、このカテゴリのコンクリートエクササイズがあり、実装する必要がある具体的なシナリオが表示されます。
このカテゴリの各エクササイズはユニークであるため、その説明はフォルダーにコロークされています。
財団の演習は、約束関連の機能、そして最終的には約束そのものを再実装することにより、約束の基礎の理解を強化するのに役立つように設計されています。
説明にはエクササイズが並べられています。
エクササイズのソリューションは、このレポジトリ、https://github.com/henriqueinonhe/promise-training/blob/master/src/exercises/concrete/concurrencyabort/exercise.tsにあります。
ただし、エクササイズを解決することで学習することが目標であるため、自分でエクササイズを解決した後にのみソリューションをチェックすることをお勧めします。
また、現在提示されているソリューションは必ずしも最高のソリューションではないことを忘れないでください。つまり、ソリューションがここにあるソリューションにまったく似ていなくても、それが悪いという意味ではありません。
新しいバージョンへのアップグレードを容易にするために、ソリューションを保持しながらインストールを最新バージョンに自動的に移行する移行スクリプトを作成しました。
移行スクリプトを実行するには、実行します。
npm create promises-training@latest -- --migrateこのプロジェクトは、CC-BY-NC-ND 4.0の下でライセンスされています。
このプロジェクトの背後にある目標は、無料の学習リソースであり、それが永遠に自由でアクセスしやすいままであることです。
ライセンスに関するいくつかの一般的な質問のQ&Aは次のとおりです。
このプロジェクトを自己研究またはグループ研究に使用できますか?
はい、してください。
このプロジェクトを内部企業のトレーニングで使用できますか?
はい、あなたがプロジェクトをクレジットし、プロジェクトがトレーニングとは無関係に自由にアクセスできることを明確にしている限り。
このプロジェクトを有料メンタリング/ワークショップセッションに使用できますか?
はい、プロジェクトをクレジットする限り、プロジェクトがメンタリング/ワークショップとは独立して自由にアクセスできることを明確にしてください。プロジェクト自体ではなく、あなたが時間を請求していることを明確にしてください。プロジェクトがあなた自身の素材の一部ではなく、あなたやあなたのサービスを支持しないことを明確にします。
このプロジェクトを有料のオンラインコースに使用できますか?
はい、プロジェクトをクレジットする限り、プロジェクトがオンラインコースとは無関係に自由にアクセスできることを明確にしてください。プロジェクト自体ではなく、あなたが時間を請求していることを明確にしてください。プロジェクトがあなた自身の資料の一部ではないことを明確にし、あなたやあなたのサービスを支持しないことを明確にします。
このプロジェクトのフォークを作成して、自分の目的のために使用できますか?
いいえ、できません。このプロジェクトのみを使用することはできませんが、変更はありません。これは、人々がフォークを作成してから請求するのを防ぐために必要です。
このプロジェクトに基づいてオンラインコースを作成できますか?
いいえ、このプロジェクトの周りに「ラッパー」を作成してから請求する人が人々が望まないからです。
ライセンスに関してご質問がある場合、または特定のユースケースについてお話ししたい場合は、[email protected]でお気軽にご連絡ください。