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