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
