web-dev-qa-db-ja.com

RxJS:初期値および/または未定義をサブスクライブしない方法

RxJSが初めてなので、将来的に値を保持するサブジェクトを作成することがよくありますが、最初はundefinedです。最初にundefinedのみ指定できます。私は現在filter値をスキップするためにundefinedを使用していますが、これは私が行うように非常に面倒ですeverywhere一度だけ必要です。 (おそらくここで何か間違ったことをしているのでしょうか?)mySubjectを介して最初の値を取得した後でのみ、onNextにサブスクライブできますか?

var mySubject = new Rx.BehaviorSubject(undefined);

mySubject.filter(function(value) {
  return value !== undefined;
}).subscribe(function(value) {
  // do something with the value
});
36
Pipo

BehaviorSubjectの代わりにnew Rx.ReplaySubject(1)を使用します。

38
Brandon

Will で述べたように、スキップ演算子を使用して最初の値をスキップすることができます。

var mySubject = new Rx.BehaviorSubject(undefined);

mySubject.skip(1).subscribe(function(value) {
  // do something with the value
});
12
lwohlhart

mySubject.pipe( skipWhile( v => !v ) );

4
Billy

場合によっては、behaviourSubjectが必要になります。初期値は重要ではなく、ストリーム内での作業中に現在の値が非同期に必要になります。ストリーム内。

これは、次の方法で実現できます。

// for user related commands
this.commandSource = new BehaviorSubject(CONTINUE);
// filtering over initial value which is continue to make it as a different pipe
const stopPipe = commandSource.pipe(filter(val => val === STOP));
const fetchStream = Observable.fromPromise(this.fetchDetails);

merge(fetchStream, stopPipe).pipe(
 take(1),
 takeWhile(() => commandSource.value === CONTINUE),
 concatMap((response) => {
  // fetch Another response you can return promise directly in concatMap
  // return array of response [1 ,2 ,3];
  return this.fetchYetAnotherDetails;
 }),
 // we can add this to stop stream in multiple places while processing the response
 takeWhile(() => commandSource.value === CONTINUE),
 // triggers parallelly values from the concatMap that is 1, 2 , 3
 mergeMap(() => // massage the response parallelly using )
 finalize(() => thi
  commandSource.complete())
).subscribe(res => {
 // handle each response 1, 2, 3 mapped
}, () => {
 // handle error
}, () => {
 // handle complete of the stream
});

// when user, clicks cancel, this should stop the stream.
commandSource.next(STOP)
0
Mukundhan

今のところ、私は filter operator を使用していますが、それが良い解決策かどうかわかりません:

var mySubject = new Rx.BehaviorSubject().filter(x => !!x);

mySubject.subscribe(value => { /* will receive value from below */);

mySubject.next('value');

mySubject.subscribe(value => { /* also receives the value */ });
0
danguilherme