コールバックと非同期性は 2 つの別個のものですが、JavaScript コールバックは非同期コードで制御フローを管理できる唯一のメカニズムであるため、関連しています。
天気予報または非非同期関数は、関数の動作に応じてコールバックを受け入れる必要があります。非同期ではないが、コールバックを提供するのに役立つタイプの関数の 1 つの例は、反復関数です。Array.each()
は良い例です。Javascript ではコード ブロックを渡すことができないため、関数を反復関数に渡します。
もう 1 つの例は、受信データを変更し、変更されたバージョンを返すフィルター関数です。Array.sort()
は良い例です。関数を渡すと、配列のソート方法に独自の条件を適用できます。
実際には、フィルタリング関数はアルゴリズムの動作を変更するため、関数/コールバックを受け入れるより強力な理由があります。反復関数は、 for ループの構文上のシュガーにすぎないため、少し冗長です。ただし、コードは読みやすくなります。
関数が非同期であるべきかどうかは別の問題です。計算に時間がかかる処理 (I/O 操作や大規模な行列計算など) を行う場合は、非同期にする必要があります。「長い」の長さは、あなた自身の許容範囲に依存します。一般的に、適度に混雑している Web サイトの場合、リクエストが完了するまでに 100 ミリ秒以上かかることはありません (つまり、最低でも 1 秒あたり 10 ヒットを処理できる必要があります)。操作にそれ以上の時間がかかる場合は、操作を分割して非同期にする必要があります。そうしないと、サイトが他のユーザーに応答しなくなる危険があります。非常に混雑している Web サイトでは、10 ミリ秒以上かかる操作を許容するべきではありません。
上記の説明から、関数またはコールバックを引数として受け入れるだけでは関数が非同期にならないことは明らかです。何かを非同期にする最も簡単な純粋な js の方法は、setTimeout を使用して長い計算を中断することです。もちろん、操作はメインの Node プロセスと同じスレッドで行われますが、少なくとも他のリクエストをブロックすることはありません。サーバーでマルチコア CPU を利用するには、NPM またはクラスターでスレッド化ライブラリの 1 つを使用して、関数を非同期にします。