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

29e*_*9er 3 observable rxjs

我正在尝试创建一个可观察对象以监视我的应用程序中的变量,并且一旦变量更改为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)
    }
}   
Run Code Online (Sandbox Code Playgroud)

因此,对于任何调用open函数的方法,我想向它们返回一个可以订阅的新Observable,以便它们知道对象何时变回null。这可能会在应用程序中其他调用close方法的地方发生

service.open({
            prop:'test',
            prop2: 'right',
        }).subscribe(s => {
            // fires when currentObject is set back to null 
            //automatically completes
        })
Run Code Online (Sandbox Code Playgroud)

尝试此操作时,我在takeUntil上收到错误消息(您在需要流的地方提供了“ null”。您可以提供Observable,Promise,Array或Iterable。

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

car*_*ant 5

takeUntil 接受一个可观察对象作为参数-而不是一个值-直到该可观察对象发出一个值。

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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)