ウェブサイト検索

javascript - 空の Observable を返す


more()関数は、getリクエストからObservableを返すことになっています

export class Collection {
  public more = (): Observable<Response> => {
    if (this.hasMore()) {
      return this.fetch();
    } else {
      // return empty observable
    }
  };

  private fetch = (): Observable<Response> => {
    return this.http.get("some-url").map((res) => {
      return res.json();
    });
  };
}

この場合、hasMore() が true の場合にのみリクエストを行うことができ、そうでない場合は subscribe() 関数で subscribe is not defined というエラーが発生します。空の Observable を返すにはどうすればよいですか?

this.collection.more().subscribe(
  (res) => {
    console.log(res);
  }, (err) => {
    console.log(err);
  }
);

回答 #1

RxJS 5.5以降の新しい構文では、これは次のようになります:

// RxJS 6
import { EMPTY, empty, of } from "rxjs";

// rxjs 5.5+ (<6)
import { empty } from "rxjs/observable/empty";
import { of } from "rxjs/observable/of";

empty(); // deprecated use EMPTY
EMPTY;
of({});

覚えておくべきことがひとつあります。EMPTY はオブザーバブルを完了させるので、ストリーム内の next はトリガーされず、完了だけが行われます。例えば tap がある場合、期待通りにトリガーされないことがあります(下の例を参照)。

一方、of({}) は Observable を作成し、{} の値で次の通知を発行し、その後 Observable を完了します。

例:

EMPTY.pipe(
    tap(() => console.warn("i will not reach here, as i am complete"))
).subscribe();

of({}).pipe(
    tap(() => console.warn("i will reach here and complete"))
).subscribe();

回答 #2

TypeScriptでは、空のObservableのジェネリックパラメータを次のように指定できます:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

回答 #3

RxJS6(互換パッケージがインストールされていない場合)

現在、EMPTY 定数と empty 関数があります。

  import { Observable, empty, EMPTY, of } from 'rxjs';

  //This is now deprecated
  var delay = empty().pipe(delay(1000));     
  var delay2 = EMPTY.pipe(delay(1000));

Observable.empty()はもう存在しません。

回答 #4

空のオブザーバブルを作成するいくつかの方法:

それらは、今後どのように使用するか(どのイベントを発生させるか:next、complete、または何もしない)についてだけ異なります。例:

  • Observable.never() - イベントを一切発行せず、終了もしません。
  • Observable.empty() - complete のみを発行します。
  • Observable.of({}) - next と complete の両方を発行します(例として空のオブジェクトリテラルが渡されています)。

あなたの正確なニーズに使用してください

回答 #5

私の場合、Angular2 と rxjs では、次の方法で動作しました:

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...

回答 #6

すべての回答が古いため、最新の回答をここに投稿します

RXJS 6以上で

import { EMPTY } from 'rxjs'
return EMPTY;

回答 #7

はい、空の演算子があります

Rx.Observable.empty();

TypeScriptの場合、fromを使用できます:

Rx.Observable<Response>.from([])

回答 #8

例えば、Observable.of(empty_variable) を返すことができます

Observable.of('');

// or
Observable.of({});

// etc

関連記事