首页 > 解决方案 > RxJs:如何在 finalize 中返回结果

问题描述

我正在尝试返回结果finalize。这是我的代码:

  const source = of(...packets);
  return source.pipe(
    concatMap(val =>
      writePacket(peripheralId, serviceUUID, characteristicUUID, val),
    ),
    map(res => {
      debugLog('in map ******');
      return {type: ResponseType.writeComplete};
    }),
    finalize(() => {
      debugLog('in finalize');
      return {type: ResponseType.writeComplete};
    }),

    catchError(err => {
      debugLog('in catch error', err);
      throwError(err);
    }),
  );

结果是在 中返回map,但不是在 finalize 中。如何从 finalize 中获得结果?

非常感谢!

标签: rxjs

解决方案


finalize回调在拆卸阶段被调用,例如当订阅被取消订阅时。这可能是complete/error通知的结果。回调的返回值不会被考虑在内。

您可以改为使用endWith运算符。所以你可以像这样替换finalize

/* ... */
endWith({type: ResponseType.writeComplete})
/* ... */

它的实现中我们可以看出

export function endWith<T>(...values: Array<T | SchedulerLike>): MonoTypeOperatorFunction<T> {
  return (source: Observable<T>) => concat(source, of(...values)) as Observable<T>;
}

endWith可以接受多个参数,


推荐阅读