RXJS:优化处理Observable流中的特定事件

时间:2017-07-20 17:03:54

标签: javascript angular rxjs observable

我正在订阅一个“无限”的Observable流。事件(' infiniteObservable')。我想对事件做一些特别的事情,例如#1,然后继续。我可以想象两种方式。 1:使用布尔标志从流中查找事件并将其设置为使用布尔值处理并继续处理流。 2:对同一个infiniteObservable使用两个可观察引用,并使用一个进行正常处理,另一个使用elementAt(1)处理感兴趣的项目。

如果没有布尔或计数器或多个观察者,有没有办法优雅地做到这一点?

下面的工作示例代码1。这段代码可以折叠成一个流(没有布尔值吗?):

//current (non-elegant? uses boolean, etc) code:
infiniteObservable.subscribe((item) => {
  this.item = item;
  if (this.item && !boolItemFound) {
    // ... do some processing
    boolItemFound = true;
  }
});

我相信必须有更优雅的方式使用rxjs运算符的功能而不诉诸于布尔值。我有一个替代方案,我发现它同样不优雅,因为它使用两个引用相同的infinitObservable(但没有布尔值)。下面的工作示例代码2(可以折叠成单个流吗?):

const normalInfiniteObservable  = infiniteObservable;
const firstInfiniteObservable= infiniteObservable;

normalInfiniteObservable .subscribe((item) => this.item = item); //process items normally

// meanwhile, grab item(1) from special processing
firstInfiniteObservable.elementAt(1).subscribe((item) => {
  // do something with item(1) only...
});

(注意:虽然以上工作,但是单元测试/业力引发 ArgumentOutOfRangeError ) 有关如何组合上述两个流并避免使用布尔值的任何建议(上文进一步说明)?

赞赏的想法!

1 个答案:

答案 0 :(得分:0)

如果您需要一些特殊的案例处理,并且它不应该编辑流(副作用),您可以使用范围压缩第一个流发射,这样您就可以拥有单个流和索引,并执行逻辑对于第N个元素。

// given a source observable 
src$.map( ( src, index ) => { src, index } )
.do(
    ( srcWithIndex ) => {
        //get index from zippedSrc.index
        // do write custom logic here
        if srcWithIndex.index == 3 [...]
    }
 )
// stream is not interrupted