我希望将多个主题(fooSubject$、barSubject$)合并为一个可观测的(filterChanged$),并在订阅合并可观测(filterChanged$)和其中一个值更改时返回(初始)值(_foo、_bar)。
我已经使用了BehaviorSubject (两个主题),但是filterChanged$将在订阅时发出两次。在订阅可观察到的不使用_foo的filterChanged$时,如何立即返回值(filterChanged$、BehaviorSubject )
export interface IFilterData {
foo: string;
bar: string;
}
@Injectable({
providedIn: 'root'
})
export class FilterService {
public foo$: Observable<string>;
public bar$: Observable<string>;
public filterChanged$: Observable<IFilterData>;
private fooSubject$: Subject<string>;
private barSubject$: Subject<string>;
private _foo: string;
private _bar: string;
constructor() {
this._foo = 'InitialFoo';
this._bar = 'InitialBar';
this.foo$ = this.fooSubject$.asObservable();
this.bar$ = this.barSubject$.asObservable();
this.filterChanged$ = merge(this.fooSubject$, this.barSubject$).pipe(
switchMap(() => {
return of({
foo: this._foo,
bar: this._bar
});
})
);
}
set foo(value: string) {
this._foo = value;
this.fooSubject$.next(value);
}
get foo(): string {
return this._foo;
}
set bar(value: string) {
this._bar = value;
this.barSubject$.next(value);
}
get bar(): string {
return this._bar;
}
}发布于 2020-05-20 16:54:03
我已经使用了BehaviorSubject (两个主题),但是filterChanged$将在订阅时发出两次。
这是因为,正如您现在可能看到的那样,当订阅BehaviorSubject时,它将同步地将其最新值发送到新订阅服务器。
如何在订阅可观察的filterChanged$时立即返回值(_foo,_bar)
有一种方法可以实现这一点,但是请注意,使用这种方法,BehaviorSubjects不会存储这些_foo和_bar值。
combineLatest(
this.fooSubject$.pipe(skip(1), startWith(this._foo)),
this.barSubject$.pipe(skip(1), startWith(this._bar)),
),.subscribe(/* ... */)这将等到每个可观测到的发射一次,然后当这两个可观测到的发射之一发出。
之所以使用skip(1),是因为我们不希望Subjects当前存储的值,而是_foo & _bar值。
https://stackoverflow.com/questions/61917161
复制相似问题