Javascript RxJS:特别对待第一个病例,但继续处理其余病例

Javascript RxJS:特别对待第一个病例,但继续处理其余病例,javascript,rxjs,reactive-programming,observers,Javascript,Rxjs,Reactive Programming,Observers,假设我想单独处理由可观察对象发出的第一个事件,但随后继续订阅 例如,如果我有以下链: observable.throttleTime(2000) .takeFirst(() => console.log('potato')) .switchMap((event:MouseEvent) => { const element:Element = event.target as Element; return this.innerOb

假设我想单独处理由可观察对象发出的第一个事件,但随后继续订阅

例如,如果我有以下链:

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

这样做失败了,但我如何才能让这种行为起作用呢?

与first和concat操作符一起使用publish。以下是一个例子:

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

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

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

例如,索引被传递给
filter()
switchMap()
takeWhile()
操作符等等。

您可以创建一个操作符,订阅源可观察对象,处理第一个元素,然后将其自身从链中移除。让我们称之为
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)
将第一个单独处理的简单解决方案是
不清楚您想做什么,RxJS也没有操作符。如果正在使用,它的投影函数将传递一个
索引
参数。我建议您使用它来确定第一个发射值。
let isFirstCame= false;

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