フロントエンドに進路を取れ

ポーリングでリアルタイム通信を実現する

June 26, 2019

昔ながらのポーリングでリアルタイム通信をするコードを書いたのでメモ。

ポーリングとは一定時間ごとにHTTP通信を繰り返し行うことを指します。 何度も繰り返して通信することによってチャットのようなリアルタイム性を持ったアプリを実現できます。

実際にコードを書くと下のようになります。

const INTERVAL = 30 * 1000;

const load = () => {
	// ここにHTTP通信する処理を書く
}

setInterval(load, INTERVAL)

setInterval()を使うことでHTTP通信する関数load()を繰り返し実行しています。

しかし、これではタブがバックグラウンドにある場合でもload()が実行されるため、無駄な通信が起きてしまいます。 対策として以下のことを考えます。

  1. タブがバックグラウンドにいるときはHTTP通信をしない
  2. タブがバックグラウンドからフォアグラウンドに移動したときにload()を実行する

タブがバックグラウンドにあるかどうかはdocument.hiddenで判定できます。 また、visibilitychangeイベントを使うことでタブが表示・非表示になったときに処理を走らせることができます。

この2つを組み合わせることで無駄な通信のないポーリングが実現できます。 コードは以下のようになります。

const INTERVAL = 30 * 1000;

const load = () => {
	if (document.hidden) {
		return;
	}
	// ここにHTTP通信する処理を書く
}

setInterval(load, INTERVAL)

document.addEventListener('visibilitychange', load);

Web Socketなどを使えばもっとスマートにリアルタイム通信を実現できると思いますが、ちょっとしたものだったらポーリングで十分実現できます。 仕事でも実際のサービスに使っていますがちゃんと問題なく動いてくれています。