如何在角度4中清空可观察对象

时间:2018-07-13 14:28:03

标签: javascript angular typescript rxjs observable

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

  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)
              }
            )
          }

1 个答案:

答案 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()不是一种方法!可以观察到,其目的是:

  1. 不发任何东西
  2. 挂断流

编辑:

如果只想忽略可观察对象的前两个元素,则可以使用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)
      })
 }

有两点需要牢记:

  1. 必须在可观察到的发射开始之前进行订阅
  2. checkPermissions在订阅过程中将忽略前两个接收到的元素,但它将接收其他所有后续元素。