我创建了一个可观察的对象,如下所示

  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/

10-16 15:57