【问题标题】:combineLatest with BehaviourSubject.asObservable causing stream was expected errorcombineLatest 与 BehaviourSubject.asObservable 导致流是预期错误
【发布时间】:2021-03-05 11:44:45
【问题描述】:

我正在尝试将 combineLatest 与 BehaviourSubject.asObservable 一起使用,但出现此错误:

TypeError: You provided 'function () {
        return this.ctaButtonSpinnerTriggered.asObservable();
    }' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
private ctaButtonSpinnerTriggered: BehaviorSubject<
    boolean
> = new BehaviorSubject(false);

public isCtaButtonSpinnerTriggered(): Observable<boolean> {
    return this.ctaButtonSpinnerTriggered.asObservable();
}

public setCtaButtonSpinnerTriggered(isDisabled: boolean): void {
    this.ctaButtonSpinnerTriggered.next(isDisabled);
}

public get showCtaSpinner(): Observable<boolean> {
    return combineLatest([
        this.ctaDisabled,
        this.isCtaButtonSpinnerTriggered,
    ]).pipe(
        map(
            ([ctaDisabled, isCtaButtonSpinnerTriggered]: [
                boolean,
                boolean
            ]) => {
                console.log(
                    !ctaDisabled,
                    isCtaButtonSpinnerTriggered,
                    'ctaDisabled + isCtaButtonSpinnerTriggered'
                );
                return !ctaDisabled && isCtaButtonSpinnerTriggered;
            }
        )
    );
}

有什么想法可以正确实现 combineLatest 和 BehaviourSubject 吗?

【问题讨论】:

    标签: angular rxjs behaviorsubject rxjs-observables


    【解决方案1】:

    改变

    return combineLatest([
            this.ctaDisabled,
            this.isCtaButtonSpinnerTriggered,
        ])
    

    return combineLatest([
            this.ctaDisabled,
            this.isCtaButtonSpinnerTriggered(), // note the parentheses here
        ])
    

    因为它不是一个 getter 函数。


    要将您的属性设置为 getter/setter,请将其更改为:

    private ctaButtonSpinnerTriggered: BehaviorSubject<
        boolean
    > = new BehaviorSubject(false);
    
    public get isCtaButtonSpinnerTriggered(): Observable<boolean> {
        return this.ctaButtonSpinnerTriggered.asObservable();
    }
    
    public set isCtaButtonSpinnerTriggered(isDisabled: boolean): void {
        this.ctaButtonSpinnerTriggered.next(isDisabled);
    }
    

    并将其用作

    return combineLatest([
            this.ctaDisabled,
            this.isCtaButtonSpinnerTriggered,
        ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多