Node.jsの非同期処理とイベントループを理解する
Node.jsを学ぶ上で、最も重要な概念が
非同期処理(Asynchronous)
です。
Node.jsは
- 高速
- 大量アクセスに強い
- リアルタイム処理が得意
という特徴があります。
この性能を支えているのが
イベントループ(Event Loop)
です。
この記事では
- 同期処理と非同期処理
- コールバック
- Promise
- async / await
- イベントループ
を初心者向けに解説します。
同期処理とは?
同期処理とは
処理を順番に実行する方式
です。
例
console.log("A")
console.log("B")
console.log("C")実行結果
A
B
C処理は
A → B → Cという順番になります。
非同期処理とは?
非同期処理とは
処理の完了を待たずに次の処理を実行する仕組み
です。
例
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サーバーを作る

コメント