Typescript とrxjs でマイナス100から100までのランダムな数字を1秒ごとに生成する

はじめに

Angular とchart.js でサンプルを作成している際にTypescript で毎秒ランダムなダミー数値を生成したくなる時がありました。
rxjs に intervalという 指定間隔で subscribeできる便利な関数があるのでそれを利用し毎秒乱数を生成する方法をまとめます。

stackblitz貼っておきます。
stackblitz.com

Rxjs interval

Angular から利用しているので RandomService というサービスクラスを作成しています。

import { Injectable } from '@angular/core';
import { interval } from 'rxjs';
import { map, startWith } from 'rxjs/operators';

@Injectable()
export class RandomService {

  public subjectdata() {
    return interval(1000).pipe(map(x => Math.floor(Math.random() * 200) - 100), startWith(0));
  }
}

Subscribe

Component から subscribeします。

this.subscription = this.randomService.subjectdata().subscribe(
  (value: number) => {
    this.randomNumber = value;
  }
)

htmlにバイディングします。
interval(1000)としているので、描画された最初の1秒は値が入りません。今回は雑に || 0 としています。

randomNumber: {{ randomNumber || 0}}

Unsubscribe

subscribeしたものは きちんと ngOnDestroy しましょう。
ページ遷移した後も虚空に乱数を放り投げることになってしまいます。
template変数として利用するのであれば、最近話題の asyncpipeでも良いかもしれません。

ngOnDestroy() {
  if (this.subscription) {
    this.subscription.unsubscribe();
  }
}

まとめ

Typescript とrxjs でマイナス100から100までのランダムな数字を1秒ごとに生成することができました。
次はchart.js 向けに毎秒 Dateを生成する方法をまとめます。