首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个主题合并为可观察到的,并在订阅时发出

如何将多个主题合并为可观察到的,并在订阅时发出
EN

Stack Overflow用户
提问于 2020-05-20 15:39:39
回答 1查看 1.9K关注 0票数 2

我希望将多个主题(fooSubject$barSubject$)合并为一个可观测的(filterChanged$),并在订阅合并可观测(filterChanged$)和其中一个值更改时返回(初始)值(_foo_bar)。

我已经使用了BehaviorSubject (两个主题),但是filterChanged$将在订阅时发出两次。在订阅可观察到的不使用_foofilterChanged$时,如何立即返回值(filterChanged$BehaviorSubject )

代码语言:javascript
复制
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;
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2020-05-20 16:54:03

我已经使用了BehaviorSubject (两个主题),但是filterChanged$将在订阅时发出两次。

这是因为,正如您现在可能看到的那样,当订阅BehaviorSubject时,它将同步地将其最新值发送到新订阅服务器

如何在订阅可观察的filterChanged$时立即返回值(_foo,_bar)

有一种方法可以实现这一点,但是请注意,使用这种方法,BehaviorSubjects不会存储这些_foo_bar值。

代码语言:javascript
复制
combineLatest(
  this.fooSubject$.pipe(skip(1), startWith(this._foo)),
  this.barSubject$.pipe(skip(1), startWith(this._bar)),
),.subscribe(/* ... */)

这将等到每个可观测到的发射一次,然后当这两个可观测到的发射之一发出。

之所以使用skip(1),是因为我们不希望Subjects当前存储的值,而是_foo & _bar值。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61917161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档