Rxjs - Observable订阅观看一个变量,完成变更

时间:2017-07-21 20:40:40

标签: rxjs observable

我正在尝试创建一个observable来观察我的应用程序中的变量,一旦变量变为null,所有订阅者都应该得到通知并完成。我假设takeUntil属性最好,但我似乎做错了。

export default class service {
    constructor($window) {
        'ngInject'
        this._currentObject = new BehaviorSubject(null)
    }

    open(config){
        this._currentObject.next(config)
        return this._currentObject.asObservable().takeUntil(null)
    }

    close(){
        this._currentObject.next(null)
    }
}   

因此对于任何调用open函数的方法,我想返回一个他们可以订阅的新Observable,这样他们就知道对象何时变回null。这将发生在应用程序中调用关闭方法

的其他位置
service.open({
            prop:'test',
            prop2: 'right',
        }).subscribe(s => {
            // fires when currentObject is set back to null 
            //automatically completes
        })

尝试这个时,我在takeUntil上遇到错误(你提供了'null',其中有一个流是预期的。你可以提供一个Observable,Promise,Array或Iterable。

我甚至不确定这是一个不错的方法,但是想知道是否有人可以看看并给我建议。 谢谢!

1 个答案:

答案 0 :(得分:4)

takeUntil将一个observable作为一个参数 - 而不是一个值 - 直到该observable发出一个值。

takeWhile更有可能是您需要的运算符,因为它需要一个谓词:



const source = new Rx.BehaviorSubject(null);
source
  .takeWhile((value, index) => (value !== null) || (index === 0))
  .subscribe(
    (value) => console.log(value),
    undefined,
    () => console.log("completed; changed back to null")
  );
  
source.next(1);
source.next(2);
source.next(3);
source.next(null);

.as-console-wrapper { max-height: 100% !important; top: 0; }

<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
&#13;
&#13;
&#13;