1. TOPTOP
  2. Webサービス
  3. Node.js

非同期通信のメリットを生かすコードの書き方 Node.jsのonメソッドは2回使う

thumbnail

クライアントPCとサーバー間の通信には2種類の通信方式があります。同期通信非同期通信です。今回の記事では、実際に通信を行うときのコードの例を交えながら、非同期通信の意味について説明いたします。

同期処理と非同期処理の比較

通常、プログラムの命令は1つの文やブロックを処理したのちに、次の命令を処理します。これを同期処理と言います。

命令1(終わるまで待つ) → 命令2(終わるまで待つ) → 命令3(終わるまで待つ) → 終了

一方、非同期処理は1つの命令やブロックの処理が終わらなくても、次の命令の処理に取りかかります。

命令1(後で処理) → 命令2(後で処理) → 命令3(後で処理) → 終了

非同期処理のメリット

非同期処理では前の命令が複雑で処理に時間がかかりそうな場合でも、次の命令の処理に移ることができます。したがって非同期処理は、なるべく処理を速く済ませたいという場合に有効な処理方法となります。

非同期処理の「処理」

ただし同期処理も非同期処理もプログラム全体を終了させないといけないということは同じです。同期処理は前の処理が済んだ後に次の処理が進むため、前の処理について考える必要はありません。ですが、非同期処理は現在の処理を行いつつ、済んでいない前の処理のことも考える必要もあります。

非同期通信の処理を行うコードの例

先にプログラムにおける非同期処理について説明しましたが、クライアントPCとリモートサーバー間における通信も同じ考え方です。同期通信の例としてPHPが挙げられますが、今回は非同期通信の処理のうち、Node.jsについてスポットをあててみましょう。

Node.jsでの非同期通信の処理

ドットインストールのNode.js入門 #13 投稿されたデータを表示しよう(新しいタブで開く)から一部コードを引用させていただきます。

server.on('request', function(req, res) {
  if (req.method === 'POST') {
    req.data = "";
    req.on("readable", function() {
      req.data += req.read();
    });
    req.on("end", function() {
      var query = qs.parse(req.data);
      posts.push(query.name);
      renderForm(posts, res);
    });
  } else {
    renderForm(posts, res);
  }
});

コードの意味をざっくりと解説すると、HTMLのフォームに何か文字列が投稿されたら、次々にその文字列が表示されていくという意味です。ここで注目すべき箇所は、requestイベントが発生した時に、さらにonメソッドでreadableイベントとendイベントを発生させている点です。

setTimeoutメソッドでは”Bad”

(requestではなくresponseですが)公式ドキュメント(新しいタブで開く)を確認すると、onメソッドとsetTimeoutメソッドの比較例が紹介されています。前者は”Good”とされ後者は”Bad”とされています。

setTimeoutメソッドが”Bad”とされてしまうのは、処理が第二引数で指定されている秒数で縛られてしまうためです。これでは瞬間的に大量のresponseをしなければならないときに、内容によっては処理が遅くなってしまいます。

したがってsetTimeoutメソッドではなくてonメソッドを使うことが推奨されています。