我创建了一个可观察的对象,如下所示
private permissionSubject = new Subject<any>();
permissionObservable$ = this.permissionSubject.asObservable();
constructor( public apiService: ApiService) { }
updatePermissionsData(permissionData){
this.permissionSubject.next(permissionData);
}
getPermissions(){
return this.apiService.get('/getUserPrivileges')
.map(data => data)
}
我正在做的是,每当获取数据时,我都会将数据推送到Observable
例如:考虑一个可观察的-> [1,2]并推3作为新数据
现在可观察到的将变为[1,2,3]
但我想从Observable中删除1、2的值,然后再将其推向3。我怎样才能做到这一点?
Observable.empty()是否可以做到这一点,如何更新代码?
我在stackoverflow中看到了很多问题,但是没有任何帮助:-(这就是为什么我再次问这个问题...
更新的代码
订阅可观察
checkPermissions() {
this.checkPermService.permissionObservable$.subscribe(
// Below one is getting executed for so many times whenever
observable get new data (stream data)
data => {
this.saveMenuItemsOnPermissions(data)
}
)
}
最佳答案
我认为对Observables的工作方式存在误解。您的代码中没有缓冲区/内存结构。
您的代码说明
// instance of a subject.
// Subjects don't have memory!! The stream is pushed to subscribers once.
private permissionSubject = new Subject<any>();
// Here you make a restriction on `permissionObservable$`, so it listens, but doesn't publish
permissionObservable$ = this.permissionSubject.asObservable();
// constructor instanciates apiService
constructor( public apiService: ApiService) { }
// each time this function is called, permissionData is pushed through
// permissionObservable and permissionObservable$ subscribers.
updatePermissionsData(permissionData){
this.permissionSubject.next(permissionData);
}
// calls a service and waits for subscription (http call I suppose)
// the map function is useless BTW
getPermissions(){
return this.apiService.get('/getUserPrivileges')
.map(data => data)
}
Observable.empty()
创建一个不发射任何物品但正常终止的Observable
Observable.empty()
不是方法!它是可观察的,其目的是:什么都不发出
挂流
编辑:
如果只想忽略可观察对象的前两个元素,则可以使用
skip
运算符。跳过运算符:
跳过使您可以忽略源的前x个发射。
通常,当您具有始终发出的可观察对象时,将使用跳过
您希望忽略的某些订阅值。也许那些
不需要前几个,或者您正在订阅重播或
BehaviorSubject,并且不需要对初始值进行操作。达到
如果您只关心以后的排放,则跳过。
// Below one is getting executed for so many times whenever observable get new data (stream data)
checkPermissions() {
this.checkPermService.permissionObservable$.skip(2)
.subscribe( data => {
this.saveMenuItemsOnPermissions(data)
})
}
有两点要牢记:
必须先进行订阅,然后才能开始观察
checkPermissions
在订阅期间将忽略前两个接收到的元素,但它将接收其他所有后续元素。关于javascript - 如何在 Angular 4中清空可观察对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51327434/