この記事では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();
// ログ出力
// 4interval(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));
// ログ出力
// 4lastValueFromは、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の最初の値を取得。
お読み頂きありがとうございました。