Rxjs:执行代码并在Observable完成时发出值

时间:2019-08-20 13:12:39

标签: rxjs

如何在Observable完成时执行一些代码并发出最终值?

RxJS提供了一个endWith运算符,该运算符采用一个值在完成时发出。但是,我想传递一个valueProvider函数,该函数仅应在我的src$ Observable完成返回应发出的最终值时执行。

const mapped$ = src$.pipe(
 //only on completion
  endWithCallback(() => {
   const endParam= this.getSomething();
   return endValue;
  }),
);

当然,上面的代码不起作用。我该如何实现这样的目标?

1 个答案:

答案 0 :(得分:1)

使用concatdefer将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;
}