我创建了一个可观察的对象,如下所示
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
Ex:考虑一个可观察的-> [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)
}
)
}
答案 0 :(得分:2)
我认为Observable的运作方式存在误解。您的代码中没有缓冲区/内存结构。
您的代码说明
// 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个发射。 通常,当您具有始终发出的可观察物时,将使用skip 您希望忽略的某些订阅值。也许那些 不需要前几个,或者您正在订阅重播或 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
在订阅过程中将忽略前两个接收到的元素,但它将接收其他所有后续元素。