JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptの非同期関数とNode.jsイベントループをわかりやすく解説

JavaScriptにおける非同期関数とは

非同期関数(Asynchronous Functions)では、処理が完了するのを待たずにプログラムは実行を続けます。つまり「待機しない」ということです。この仕組みにより、ユーザーが待たされる時間を大幅に削減できます。実は、JavaScriptというプログラミング言語そのものが非同期で動作するように設計されています。

例えば、コード内で完了まで多くの時間を要する重いリクエストを実行した場合を考えてみましょう。もし同期的な処理だった場合、その待ち時間の間、ユーザーは何も操作できなくなってしまいます。

このような理由から、時間のかかる重い処理を行う際には、一般的に非同期コードを使用することが推奨されています。

JavaScriptの非同期関数の例

以下のコードを見てみましょう。

console.log('One');
jQuery.get('page.html', function (data)
{
    console.log("Two");
});
console.log('Three');

出力結果

One, Three, Two

jQuery.get()による通信は非同期で実行されるため、レスポンスの取得を待たずに次の処理へ進みます。そのため、コンソールにはまず「One」が出力され、続いて「Three」が出力され、最後にサーバーから応答が返ってきたタイミングで「Two」が出力されます。これこそが、JavaScriptの非同期動作の典型的な例です。

Node.jsのイベントループとは

次に、Node.jsにおけるイベントループ(Event Loop)について解説します。

イベントループは、ある時点においてスレッドがどの操作を実行すべきかを管理するスレッドスケジューラの内部で生成されます。

すべてのNode.jsアプリケーションは、着信接続、I/O完了、タイムアウトの期限切れ、Promiseの解決など、さまざまなイベントへの反応として実行されるコールバックで構成されています。そして、メインスレッド(すなわちイベントループ)がこれらすべてのコールバックを実行します。

イベントループの仕組み

イベントループが稼働している間、Node.jsは各イテレーション(繰り返し)ごとに、未処理の非同期I/Oやタイマーが存在するかどうかをチェックします。そして、何も見つからなければ、Node.jsはアプリケーションをシャットダウンします。

このようにイベントループは、Node.jsがシングルスレッドでありながら多数のリクエストを効率的に捌くことを可能にしている、中核的な仕組みといえます。

  1. JavaScriptのencodeURI()・decodeURI()関数の使い方を徹底解説

    JavaScriptには、URL(URI)を安全に扱うための組み込み関数として encodeURI() と decodeURI() が用意されています。この記事では、それぞれの役割と実際の使い方をサンプルコード付きで解説します。 encodeURI()関数とは encodeURI()関数は、URI全体をエンコードするための関数です。日本語やスペースなど、URLにそのまま含めることができない文字をパーセントエンコーディング(%エンコード)に変換します。 ただし、URIの構造上特別な意味を持つ予約文字である以下の文字はエンコードされず、そのまま残ります。 , / ? : @ & = + $

  2. JavaScriptで非同期ループを実装する方法をわかりやすく解説

    JavaScriptでは、async/awaitとPromiseを組み合わせることで、各処理の完了を待ちながら繰り返しを実行する「非同期ループ」を実装できます。通常のループ内で時間のかかる処理(API通信やタイマー処理など)を順番に実行したい場合に非常に便利です。以下は、JavaScriptで非同期ループを実装するコード例です。コード例<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="vi