この記事ではRxJSの『EMPTY』について、以下の内容をサンプルコードを用いてわかりやすく解説します。
- RxJSの
EMPTY
とは EMPTY
の使い方EMPTY
の用途EMPTY
、NEVER
、throwError
の違い
RxJSのEMPTYとは
EMPTY
は値を何も発行せず、即座に完了通知を発行するObservableです。
EMPTYの特徴
- 値を発行しない
EMPTY
は、ストリーム内でnext
を一切呼び出しません。
- 即座に完了する
- サブスクライブするとすぐに
complete
通知を発行して終了します。
- サブスクライブするとすぐに
EMPTYの使い方
以下のサンプルコードでEMPTY
の動作を確認してみましょう。
import { EMPTY } from 'rxjs';
EMPTY.subscribe({
next: (value) => console.log(`Next: ${value}`), // 呼び出されない
error: (err) => console.log(`Error: ${err.message}`), // 呼び出されない
complete: () => console.log('Observableが完了しました'), // 呼び出される
});
// 実行結果
// Observableが完了しました
上記のサンプルコードを実行するとわかる通り、complete
だけが呼び出されることが分かります。
EMPTYの用途
EMPTY
は実際のアプリケーションでは以下の用途で使用することが多いです。
- 条件によって処理をスキップしたい場合
- エラーが発生した際に代替処理を提供する場合
各用途について順番に説明します。
条件によって処理をスキップしたい場合
EMPTY
は、条件によって処理をスキップしたい場合に便利です。サンプルコードを以下に示します。
import { EMPTY, of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
const condition = false;
of('データ取得リクエスト')
.pipe(
switchMap((message) => {
if (condition) {
return of(`条件が真: ${message}`);
} else {
return EMPTY; // 条件が偽の場合は何も返さない
}
})
)
.subscribe({
next: (value) => console.log(`Next: ${value}`),
complete: () => console.log('Observableが完了しました'),
});
// 実行結果
// Observableが完了しました
条件がfalse
の場合は何も発行されず、complete
のみが呼び出されます。
エラーが発生した際に代替処理を提供する場合
EMPTY
は、エラーが発生した際に代替処理を提供する場合にも利用されます。サンプルコードを以下に示します。
import { EMPTY, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
throwError(() => new Error('エラーが発生しました'))
.pipe(
catchError((error) => {
console.error(error.message);
return EMPTY; // エラー時に何も返さない
})
)
.subscribe({
next: (value) => console.log(`Next: ${value}`),
complete: () => console.log('Observableが完了しました'),
});
// 実行結果
// エラーが発生しました
// Observableが完了しました
エラーが発生すると、キャッチして、EMPTY
によってストリームを安全に終了しています。
EMPTY、NEVER、throwErrorの違い
EMPTY
は完了通知だけを発行して即座に終了するObservableであり、complete
のみが呼び出されます。似たようなObservableにNEVER
とthrowError
があるので、その違いを以下の表でまとめます。
動作 | 通知されるイベント | 特徴 | |
EMPTY | 完了通知 (complete ) を即座に発行し、終了する。 | complete のみ。 | next や error は呼び出されず、complete を発行してただストリームを終了させる。 |
NEVER | 何も発行せず、通知も終了もしない。 | なし。 | next 、error 、complete のいずれも呼び出されない。無限に動作し続けるようなストリームです。 |
throwError | エラー(error )を即座に発行し、終了する。 | error のみ。 | next や complete は呼び出されず、error を発行してストリームを終了させる。 |
各動作が分かるサンプルコードを以下に示します。
EMPTY
import { EMPTY } from 'rxjs';
EMPTY.subscribe({
next: (value) => console.log(`Next: ${value}`),
error: (err) => console.log(`Error: ${err.message}`),
complete: () => console.log('Observableが完了しました'),
});
// 実行結果
// Observableが完了しました
complete
のみが呼び出されます。
NEVER
import { NEVER } from 'rxjs';
NEVER.subscribe({
next: (value) => console.log(`Next: ${value}`),
error: (err) => console.log(`Error: ${err.message}`),
complete: () => console.log('Observableが完了しました'),
});
// 実行結果
// (何も表示されず、next/error/completeのコールバックも呼び出されない)
next
もerror
もcomplete
も呼び出されません。
throwError
import { throwError } from 'rxjs';
throwError(() => new Error('エラーが発生しました')).subscribe({
next: (value) => console.log(`Next: ${value}`),
error: (err) => console.log(`Error: ${err.message}`),
complete: () => console.log('Observableが完了しました'),
});
// 実行結果
// Error: エラーが発生しました
error
のみが呼び出されます。
本記事のまとめ
この記事ではRxJSの『EMPTY』について、以下の内容を説明しました。
- RxJSの
EMPTY
とは EMPTY
の使い方EMPTY
の用途EMPTY
、NEVER
、throwError
の違い
お読み頂きありがとうございました。