仅选择 Store 中的最新值

Mic*_*ouw 5 rxjs ngrx

对 SO 的一些搜索让我相信没有好的(简单的)方法来实现标题中的问题。以下线程都非常相关:

获取 ngrx 中的当前状态

获取 ngrx 中的当前状态

无需订阅即可获取当前 ngrx 状态

使用ngrx一次获取store的当前状态

如何使用@ngrx/store获取State对象的当前值?

从最后一个线程 ^ 来看,实现这一点的唯一方法似乎是使用withLatestFrom()or combineLatest()

以下不可能是确保您只收到 1 件商品且该商品是最新商品的唯一方法:

of('terribleLatestValueHack').pipe(
  withLatestFrom(this.store.select(itemSelector))
  ).subscribe((stringAndItem: [string, Item]) => {
    const [, item] = stringAndItem;
    // do something with item
});
Run Code Online (Sandbox Code Playgroud)

鉴于从商店中选择一件最新商品

  • 是一个(非常)简单的用例
  • 似乎是一个强烈要求的功能

我真的很想知道为什么现有的支持(显然 - 在 NGRX v2 中 - 根据How to get current value of State object with @ngrx/store?)已被删除。

Mic*_*ouw 5

我忘了补充一点,我的印象是store.select(...).pipe(first())不会从商店退回最新的商品。但看起来确实如此,并且它返回的任何错误值的原因都在于我们自己的代码中。

store.select(...).pipe(first())实际上只是这样做:从 a 返回一项当前项目Store(并完成Observable)。

  • 我相信 NgRX 作者遵循的原则是“让你的代码好像一切都是异步的,并对发生的事件做出反应”。所以他们确实是在试图鼓励你不要关注“当前”状态。我不确定我是否真的同意这一点,因为有时您现在只需要当前值。我将我们的状态服务包装在一堆类中,这些类具有诸如“getXCurrent()”之类的方法,这些方法本质上是`let a = null; this.store.select(x => xy).pipe(take(1)).subscribe((y) => a = y); return a;` - 将返回 null 或当前值(如果有)。 (2认同)