【问题标题】:rxjs access to object value by keyrxjs 按键访问对象值
【发布时间】:2020-05-18 13:52:42
【问题描述】:

我有一个 observable,它是一个带有键值对的对象数组。

我可以通过以下方式访问该数组的第一个元素:

const source = this.store.select('news').pipe();
    const element = source.subscribe(val => console.log(val.news[0]));

它在控制台中正确记录我的对象。

如果我尝试只记录 newsId by

const source = this.store.select('news').pipe(); const element = source.subscribe(val => console.log(val.news[0].newsId));

我收到错误“无法读取未定义的属性‘newsId’”。

如何将对象定义为一个整体,但如果我尝试访问该对象,它会告诉我它是未定义的?

【问题讨论】:

  • 你能告诉我们store.select的代码和包含数据的数组吗?
  • 抱歉,“store.select 的代码”是什么意思?我只是去“新闻”状态。我怎么给你看数组?没有机会加载屏幕截图...
  • observable 传递一个对象“新闻”。该对象包含一个“新闻”数组,数组的每个元素都包含一些键值对。在这些键值对中,有一个包含数字的 newsID。我想获取数组元素0的newsId的值。
  • @JJJanezic 我同意,这听起来很奇怪。您确定您在代码中完全相同的位置同时执行“console.log(val.news[0])”和“console.log(val.news[0].newsId)”,没有别的变了吗?
  • 是的,我没有 newsId -> 可以;我更改了代码 -> 它没有。

标签: angular rxjs observable


【解决方案1】:

可能有多种原因。

  • 也许 news 数组的第一个元素最初不包含 newsId 字段,然后控制台中打印的 news[0] 稍后通过引用更新
  • 可能新闻数组包含一些undefined 值以及有效新闻。

所以,首先尝试记录整个数组val.news 并确保该数组中的所有元素都已定义。还要确保来自该 Observable 的所有事件都是您所期望的。

不管怎样,pipe() 只有当你打算使用一些 rxjs 操作符时才需要,否则它在那里没有任何意义(实际上它会迷惑新手)。

【讨论】:

  • 这听起来是正确的方法。该站点上有 2 个组件。第一个包含相应的代码,而第二个从服务器获取数据并将其放入存储中。因此,当第一个组件被初始化时,数据还没有在存储中,并且 observable 是未定义的。一秒钟后,数据被加载到存储中,observable(包含数组)传递数组。我怎样才能避免这种影响?
  • 您可以像this.store.select('news').pipe(filter(v => !!v)); 这样过滤未定义的值。有多种方法可以做到这一点,检查 v 是否是一个数组并且它是否具有元素也是一个好主意。或者,您可以将存储状态初始化为空数组而不是未定义,但这取决于您的实现..
  • 谢谢,目前我已经实现了一个try/catch。这很好用,但这是一个好的做法吗?
  • 不是。您应该在回调中处理这种情况,或者使用 filter 运算符过滤您不感兴趣的事件。 try-catch 是一个同步构造,并不真正适合(按原样)进入可观察世界
  • 我尝试在回调中这样做,但没有成功。这段代码有什么问题?谢谢!!! this.latestNewsIdSub = this.store.select('news').subscribe( appState => this.latestNewsId = appState.news[0].newsId, () => this.latestNewsId = 0);
猜你喜欢
  • 2021-05-13
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2018-07-15
相关资源
最近更新 更多