我正在尝试创建一个可观察对象以监视我的应用程序中的变量,并且一旦变量更改为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。)
我什至不确定这是否是一种不错的方法,但我想知道是否有人可以看看并给我建议。谢谢!
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)