RxJS:专门处理第一个案例,但继续流动其余的

时间:2017-05-26 21:05:37

标签: javascript rxjs reactive-programming observers

假设我想单独处理Observable发出的第一个事件,但继续我的订阅。

例如,如果我有以下链:

observable.throttleTime(2000)
      .takeFirst(() => console.log('potato'))
      .switchMap((event:MouseEvent) => {
        const element:Element = event.target as Element;
        return this.innerObservable(('tomato'));
      })
      .subscribe(({result}) => console.log(result))

失败了,但我怎样才能使这种行为发挥作用呢?

4 个答案:

答案 0 :(得分:3)

许多采用回调函数的RxJS 5运算符也传递了项目的索引。这意味着您可以编写以下示例:

observable.throttleTime(2000)
    .map((value, index) => index === 0 ? 'potato' : value)
    ...
    .subscribe(({result}) => console.log(result))

指数已传递给filter()switchMap()takeWhile()运营商等。

答案 1 :(得分:0)

将first与first和concat运算符一起使用。这是一个例子:

Rx.Observable.interval(1000)
 .publish(shared => {
    return  shared.first().mapTo('FIRST')
       .concat(shared.skip(1));
})
.subscribe(x=>console.log(x))

答案 2 :(得分:0)

您可以创建一个订阅源observable的运算符,处理第一个元素,然后从链中删除自己。我们称之为onFirst,因为takeFirst是Java中的现有运算符。 Rxjs 5例子:

Observable.prototype.onFirst = function(callback) {
  return Observable.create(observer => {
    let source = this.publish()
    let subs = source.subscribe({
      next(v) {
        subs.unsubscribe()
        source.subscribe(observer)
        callback(v)
      },
      error(e) { observer.error(e) },
      complete() { observer.complete() }
    })
    source.connect()
  })
}

// This prints
// first: 1
// 2
// 3
Observable.of(1, 2, 3)
  .onFirst(v => console.log("first: " + v))
  .subscribe(console.log)

答案 3 :(得分:0)

单独处理第一个的简单解决方案是

let isFirstCame= false;

 observable
      .subscribe(({result}) =>
         if(!isFirst){
            //here is our first one
            doSpecialWithTheFirst(result);
            isFirstCame=true;
         }else{
           //All the remaining
           doOtherWithRemaining();
         })