この記事ではRxJSの『lastValueFrom』について、以下の内容をサンプルコードを用いて分かりやすく解説します。
lastValueFrom
とはlastValueFrom
の「使い方」lastValueFrom
の「特徴」lastValueFrom
とfirstValueFrom
の違い
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
を用いたサンプルコードを以下に示します。以下のサンプルコードでは、最後に流れる値4
がlastValueFrom
によって取得されます。
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』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 続きを見る【RxJS】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ベースの環境や最後の値だけを取得したい場合に便利。
- RxJSの
lastValueFrom
の「使い方」- 基本的な使用方法:
await
やthen
で最後の値を取得。 - エラー処理:
catch
またはtry-catch
を使用してエラーをハンドリング。
- 基本的な使用方法:
lastValueFrom
の「特徴」- 最後の値のみ取得する:途中の値は無視され、完了時の最後の値が取得される。
- 完了しないObservableでは値を取得できない:無限に続くObservableでは結果が得られない。
- 値を発行せずに完了した場合エラーになる:
No elements in sequence
エラーが発生。
lastValueFrom
とfirstValueFrom
の違いlastValueFrom
:Observableの最後の値を取得。firstValueFrom
:Observableの最初の値を取得。
お読み頂きありがとうございました。