【RxJS】lastValueFromとは?「使い方」や「特徴」を分かりやすく解説!

この記事ではRxJSの『lastValueFrom』について、以下の内容をサンプルコードを用いて分かりやすく解説します。

  • lastValueFromとは
  • lastValueFromの「使い方」
  • lastValueFromの「特徴」
  • lastValueFromfirstValueFromの違い

RxJSのlastValueFromとは

RxJSのlastValueFromは、ObservableをPromiseに変換し、Observableが完了する際の最後の値を取得する関数です。非同期処理がPromiseベースで記述されている環境や、最後の値だけを取得したい場合に便利です。

以下にlastValueFromを用いたサンプルコードを示します。

import { interval, lastValueFrom, take } from 'rxjs';

async function main() {
  // 1000msごとに値を発行するObservable
  const observable$ = interval(1000).pipe(take(5)); // 0, 1, 2, 3, 4 を発行

  // Observableの最後の値をPromiseで取得
  const lastValue = await lastValueFrom(observable$);
  console.log(lastValue);
}

main();

// ログ出力
// 4

interval(1000)では、1秒(1000ミリ秒)ごとに値を発行するObservableを作成します(例: 0, 1, 2, 3, ...)。そして、take(5)オペレーターを使って、Observableが5回値を発行したら完了するようにしています。これにより、このObservableは0, 1, 2, ..., 4までの値を発行して完了します。lastValueFromは、Observableが完了する際に発行した最後の値をPromiseとして返すので、observable$が最後に発行する値4が取得されます。

lastValueFromの「使い方」

lastValueFromの使い方について、thenを用いたサンプルコードを以下に示します。以下のサンプルコードでは、最後に流れる値4lastValueFromによって取得されます。

import { interval, lastValueFrom, take } from 'rxjs';

// 1000msごとに値を発行するObservable
const observable$ = interval(1000).pipe(take(5)); // 0, 1, 2, 3, 4 を発行

// Observableの最後の値をPromiseで取得
lastValueFrom(observable$).then((lastValue) => console.log(lastValue));

// ログ出力
// 4

lastValueFromは、Observableがエラーを発生させた場合、そのエラーがPromiseのcatchで処理されます。

import { lastValueFrom, throwError } from 'rxjs';

const error$ = throwError(() => new Error('エラーです!!'));

lastValueFrom(error$).catch((err) => console.error(err.message));

// ログ出力
// エラーです!!

非同期関数内でエラーをハンドリングする場合は、try-catchを使用します。

import { lastValueFrom, throwError } from 'rxjs';

async function main() {
  const error$ = throwError(() => new Error('エラーです!!'));

  try {
    const result = await lastValueFrom(error$);
    console.log(result);
  } catch (err) {
    console.error(err.message);
  }
}

main();

// ログ出力
// エラーです!!

lastValueFromの「特徴」

lastValueFromの特徴を以下に示します。

  • 最後の値のみ取得する
  • 完了しないObservableでは値を取得できない
  • Observableが値を発行せずに完了した場合にはエラーとなる

上記の特徴についてサンプルコードをもちいてこれから説明します。

最後の値のみ取得する

lastValueFromは、Observableが完了する際の最後の値をPromiseとして返します。途中の値は無視されます。サンプルコードを以下に示します。

import { interval, lastValueFrom, take } from 'rxjs';

// 1000msごとに値を発行するObservable
const observable$ = interval(1000).pipe(take(5)); // 0, 1, 2, 3, 4 を発行

lastValueFrom(observable$).then((value) => console.log(value));

// ログ出力
// 4

完了しないObservableでは値を取得できない

lastValueFromは、Observableが完了しない場合に値を取得できません。以下のサンプルコードでは、Observableが永遠に値を発行し続けるため、lastValueFromは値を取得することができません。

import { interval, lastValueFrom } from 'rxjs';

// 1000msごとに値を発行するObservable
const infinite$ = interval(1000);

lastValueFrom(infinite$).catch((err) => console.error('Error:', err.message));

// ログ出力
// なし(何も値を取得できないため)

Observableが値を発行せずに完了した場合にはエラーとなる

lastValueFromは、Observableが値を発行せずに完了した場合もエラーとなります。

import { EMPTY, lastValueFrom } from 'rxjs';

lastValueFrom(EMPTY).catch((err) => console.error('Error:', err.message));

// ログ出力
// Error: No elements in sequence

あわせて読みたい

EMPTY値を何も発行せず、即座に完了通知を発行するObservableです。

EMPTY』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

lastValueFromとfirstValueFromの違い

lastValueFromに似た関数としてfirstValueFromがあります。その名の通り、lastValueFromは最後の値を取得、firstValueFromは最初の値を取得する関数です。サンプルコードを以下に示します。

import { firstValueFrom, interval, lastValueFrom, take } from 'rxjs';

const observable$ = interval(1000).pipe(take(5)); // 0, 1, 2, 3, 4 を発行

// 最初の値を取得
firstValueFrom(observable$).then((value) => console.log('First:', value)); // 0

// 最後の値を取得
lastValueFrom(observable$).then((value) => console.log('Last:', value)); // 4

本記事のまとめ

この記事では『lastValueFrom』について、以下の内容を説明しました。

  • lastValueFromとは
    • RxJSのlastValueFromは、ObservableをPromiseに変換し、完了時に最後の値を取得する関数。
    • 非同期処理がPromiseベースの環境や最後の値だけを取得したい場合に便利。
  • lastValueFromの「使い方」
    • 基本的な使用方法:awaitthenで最後の値を取得。
    • エラー処理:catchまたはtry-catchを使用してエラーをハンドリング。
  • lastValueFromの「特徴」
    • 最後の値のみ取得する:途中の値は無視され、完了時の最後の値が取得される。
    • 完了しないObservableでは値を取得できない:無限に続くObservableでは結果が得られない。
    • 値を発行せずに完了した場合エラーになるNo elements in sequenceエラーが発生。
  • lastValueFromfirstValueFromの違い
    • lastValueFrom:Observableの最後の値を取得。
    • firstValueFrom:Observableの最初の値を取得。

お読み頂きありがとうございました。