如何在Observable完成时执行一些代码并发出最终值?
RxJS提供了一个endWith
运算符,该运算符采用一个值在完成时发出。但是,我想传递一个valueProvider
函数,该函数仅应在我的src$
Observable完成返回应发出的最终值时执行。
const mapped$ = src$.pipe(
//only on completion
endWithCallback(() => {
const endParam= this.getSomething();
return endValue;
}),
);
当然,上面的代码不起作用。我该如何实现这样的目标?
答案 0 :(得分:1)
使用concat
和defer
将Observable附加到您的源中,该源的内部代码在源完成后执行。
concat(src$, defer(() => of(getLast())))
您还可以创建一个执行该操作的操作符。
src$.pipe(withLast(getLast))
// 1. emits the same type as source
export function withLast<T>(getLast: () => T): MonoTypeOperatorFunction<T> {
return (source: Observable<T>) => concat(source, defer(() => of(getLast())));
}
// 2. emits a different type than source
export function withLastAs<T, R>(getLast: () => R): OperatorFunction<T, R> {
return (source: Observable<T>) => source.lift.call(
concat(source, defer(() => of(getLast())))
);
}
getLast
包含您要在源代码完成后执行的代码,并返回将最后发出的值。
function getLast(): any {
console.log('on last');
const endParam = this.getSomething();
return endValue;
}