Node.js入門 第4回

Node.js

Node.jsの非同期処理とイベントループを理解する

Node.jsを学ぶ上で、最も重要な概念

非同期処理(Asynchronous)

です。

Node.jsは

  • 高速
  • 大量アクセスに強い
  • リアルタイム処理が得意

という特徴があります。

この性能を支えているのが

イベントループ(Event Loop)

です。

この記事では

  • 同期処理と非同期処理
  • コールバック
  • Promise
  • async / await
  • イベントループ

を初心者向けに解説します。

同期処理とは?

同期処理とは

処理を順番に実行する方式

です。

console.log("A")
console.log("B")
console.log("C")

実行結果

A
B
C

処理は

ABC

という順番になります。

非同期処理とは?

非同期処理とは

処理の完了を待たずに次の処理を実行する仕組み

です。

setTimeout(() => {
    console.log("A")
}, 1000)

console.log("B")

実行結果

B
A

処理の流れ

タイマー開始

B 実行

1秒後

A 実行

このように 順番が変わる のが非同期処理です。

なぜNode.jsは非同期なのか?

通常のサーバーは

リクエスト

処理

レスポンス

1つずつ処理します。

しかしNode.jsでは

リクエストA
リクエストB
リクエストC

を 同時に処理できます。

例えば

DBアクセス
ファイル読み込み
API通信

などを待っている間に

他の処理を実行できるのです。

そのためNode.jsは

高パフォーマンス

になります。

コールバック関数

Node.jsでは昔から

コールバック関数

を使って非同期処理を行います。

setTimeout(() => {
    console.log("処理完了")
}, 1000)

この関数は

1秒後に実行される

という意味になります。

コールバック地獄

コールバックを多用すると

ネストが深くなる問題

があります。

login(user, () => {
    getProfile(() => {
        getPosts(() => {
            getComments(() => {
                console.log("完了")
            })
        })
    })
})

これを

Callback Hell(コールバック地獄)

と言います。

そこで登場したのが、Promiseです。

Promise

Promiseは

非同期処理を管理するオブジェクト

です。

const promise = new Promise((resolve, reject) => {

    setTimeout(() => {
        resolve("成功")
    },1000)

})

結果を受け取る

promise.then(result => {
    console.log(result)
})

実行結果

成功

Promiseチェーン

Promiseは連続処理が書きやすくなります。

login()
.then(getProfile)
.then(getPosts)
.then(getComments)
.then(() => {
    console.log("完了")
})

コールバックより かなり読みやすい です。

async / await

現在のNode.jsでは

async / await

が主流です。

Promiseを 同期処理のように書ける 機能です。

async function main(){

    const result = await getUser()

    console.log(result)

}

main()

メリット

  • 可読性が高い
  • エラー処理が簡単
  • コードがシンプル

try / catch

async / awaitでは

エラー処理も簡単です。

async function main(){

    try{

        const user = await getUser()

        console.log(user)

    }catch(err){

        console.log(err)

    }

}

Node.jsのイベントループ

Node.jsの核心が

イベントループ

です。

イベントループとは

非同期処理を管理する仕組み

です。

処理の流れ

1 JavaScript実行
2 非同期処理登録
3 イベントキュー
4 イベントループ
5 コールバック実行

イベントループの流れ

Call Stack

Web API

Callback Queue

Event Loop

Call Stack

処理の例

console.log("A")

setTimeout(() => {
    console.log("B")
},0)

console.log("C")

結果

A
C
B

理由

A実行
C実行
Bキューから実行

Node.jsが高速な理由

Node.jsは

シングルスレッド

です。

普通なら遅くなりそうですが

イベントループ
+
非同期I/O

により

大量アクセスでも高速処理

が可能です。

Node.jsが得意な処理

Node.jsが特に強いのは

  • APIサーバー
  • チャット
  • WebSocket
  • ストリーミング
  • リアルタイム通信

です。

まとめ

Node.jsの最大の特徴は

非同期処理

です。

今回のポイント

  • 同期処理と非同期処理
  • コールバック
  • Promise
  • async / await
  • イベントループ

これらを理解すると

Node.jsの仕組みが見えてきます。

次回は、Node.jsでHTTPサーバーを作る

コメント

タイトルとURLをコピーしました