首页 > 解决方案 > 如何使`shared` Observable 允许触发第二个 observable 一次而不是每次发射?

问题描述

我有一个可观察的源,用于 WS 连接。那个连接被打开了onMount。最重要的是,我触发另一个 observableonMount以允许 LoadingIndicator 屏幕,直到数据到达。我希望该指标一直存在,直到数据从源 observable 发出,我已经这样做了。

  const mount$ = action$.pipe(Type.ON_MOUNT);

  const source$ = mount$.pipe(
    ... // Stuff happen here..
    share()
  );

  const setSuccess$ = source$.pipe(
    map(() => ({ type: Type.SET_LOADING, payload: false }))
  );

  const setLoading$ = mount$.pipe(map(() => ({ type: Type.SET_LOADING, payload: true })));

  return merge(source$, setLoading$, setSuccess$);

然后,我有setSucccessobservable,它正在监听sourceobservable 发射,并设置isLoading为 false。这就是问题所在。每次排放都会发生这种情况。我希望这仅发生在第一个上。我怎样才能做到这一点?

我尝试了一些不同的东西。我试过了shareReplay({ refCount: true, bufferSize: 1 }),但没有任何效果。我怎样才能只发出第二个共享的 observable (setSuccess$) 一次?take(1)setSuccess$

标签: javascripttypescriptrxjsmulticast

解决方案


你不需要setLoading$mount$. 它最初处于加载状态,因此您可以

return merge(source$, of({ type: Type.SET_LOADING, payload: true }), setSuccess$.pipe(take(1)));

推荐阅读