withLatestFrom 不发出值

Luk*_*váč 3 rxjs

我正在尝试阻止主流,直到使用withLatestFrom运算符和辅助流(其中包含有关配置状态的信息)初始化配置。

这是我的代码:

@Effect()
public navigationToActiveRedemptionOffers = this.actions$.ofType(ROUTER_NAVIGATION)
  .filter((action: RouterNavigationAction<RouterStateProjection>) => {
    return action.payload.event.url.includes('/redemption-offers/list/active');
  })
  .do(() => console.log('before withLatestFrom'))
  .withLatestFrom(
    this.store.select(selectConfigInitialized)
      .do(initialized => console.log('before config filter', initialized))
      .filter(initialized => initialized)
      .do(initialized => console.log('after config filter', initialized)),
  )
  .do(() => console.log('after withLatestFrom'))
  .switchMap(data => {
    const action = data[0] as RouterNavigationAction<RouterStateProjection>;

    return [
      new MapListingOptionsAction(action.payload.routerState.queryParams),
      new LoadActiveOffersAction(),
    ];
  });
Run Code Online (Sandbox Code Playgroud)

问题是第二个do(之后withLatestFrom)块永远不会被调用。日志:

  • 在配置过滤器 false 之前
  • 之前与最新来自
  • 在配置过滤器为真之前
  • 配置过滤器为真后

谢谢你的建议。

byg*_*ace 6

我想你想要的是.combineLatest

withLatestFrom只将它之前的内容视为触发器。 combineLatest将源和提供给它的 observables 都视为触发器。

所以你的问题是源(路由更改)触发并且传递给withLatest(状态初始化)的可观察对象由于其过滤器尚未发出。它只在源触发后发出一个值。所以它被忽略了。

这是您正在执行的操作的运行示例:

const first = Rx.Observable.create((o) => {
  setTimeout(() => {
    o.next();
  }, 2000);
});
const second = Rx.Observable.create((o) => {
  setTimeout(() => {
    o.next(false);
  }, 1000);
  setTimeout(() => {
    o.next(true);
  }, 3000);
});

first
  .do(() => console.log('before withLatestFrom'))
  .withLatestFrom(
    second
      .do(initialized => console.log('before config filter', initialized))
      .filter(initialized => initialized)
      .do(initialized => console.log('after config filter', initialized)),
  )
  .subscribe(() => console.log('after withLatestFrom'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
Run Code Online (Sandbox Code Playgroud)

这是与combineLatest

const first = Rx.Observable.create((o) => {
  setTimeout(() => {
    o.next();
  }, 2000);
});
const second = Rx.Observable.create((o) => {
  setTimeout(() => {
    o.next(false);
  }, 1000);
  setTimeout(() => {
    o.next(true);
  }, 3000);
});

first
  .do(() => console.log('before withLatestFrom'))
  .combineLatest(
    second
      .do(initialized => console.log('before config filter', initialized))
      .filter(initialized => initialized)
      .do(initialized => console.log('after config filter', initialized)),
  )
  .subscribe(() => console.log('after withLatestFrom'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
Run Code Online (Sandbox Code Playgroud)