假设我想单独处理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))
失败了,但我怎样才能使这种行为发挥作用呢?
答案 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();
})