プロミスがマイクロタスクを導入する理由
Promiseの実行関数は同期ですが、その中に非同期処理があり、非同期処理の最後にresolveメソッドを呼び出したり、途中でエラーが発生したときにrejectメソッドを呼び出したりしますが、いずれもEventLoopにマイクロタスクとして追加されます。そして、なぜマイクロタスクがあるのでしょうか?
コールバックの問題を処理する終了方法
- すべての非同期タスクが実行されるまで同期コールバックを使用してから、後のタスクに進みます。
- 非同期コールバックを使用して、コールバック関数を現在のすべてのマクロタスクのキューの最後に配置します。
- 非同期コールバックを使用して、コールバック関数を現在のマクロタスクの最後に配置します。
比較的
なぜなら、同期的な方法はプログラム全体の実行効果に影響を与え、あるタスクの実行時間が非常に長い場合、次のタスクに影響を与え、この待ち時間の一部が他のことに使われる可能性があり、結果としてCPUの利用率が低くなるからです。これに加えて、遅延バインディングの効果を達成することはできません コールバック関数を実行する2番目の方法のタイミングは、現在のマクロタスクがすべて実行された後、今実行される多くのマクロタスクがある場合、それはまた、ブロッキングになり、このコールバック関数は、遅延され、ページラグが発生します 以上の理由から、プロミスは、マイクロタスクの導入である3番目の方法を採用し、現在のマクロタスクの最後に配置され、コールバック関数は現在のマクロタスクの最後に配置されます。
ペインポイントを解決
- 同期コールバックの代わりに非同期コールバックを使うことで、無駄なCPUパフォーマンスの問題を解決
- リアルタイム・コールバック実行の問題を解決するために、現在のマクロ・タスクの最後に置きます。
結集地獄
- 重層ネスティング
- 成功と失敗の2つの可能性は、実行後に各タスクで別々に処理されます。
治療
- コールバック関数の遅延バインディング: コールバック関数は直接宣言されません。
- 戻り値のパススルー: 連鎖呼び出しが容易になります。
- エラー・バブリング: 最後のキャッチで受信。