【问题标题】:Subscribing to multiple observable<boolean> in a foreach loop?在 foreach 循环中订阅多个 observable<boolean>?
【发布时间】:2018-07-10 12:19:27
【问题描述】:

我有一个带有子组件查询列表的组件。这些子组件中的每一个都公开了两个方法,一个返回表单是否有效作为observable&lt;boolean&gt;,另一个返回一个对象。

在父组件中,我想循环遍历子组件并检查每个子组件是否有效。我有这样的代码

    let valid: boolean = true;
    children.forEach(r => {
       r.validate().subscribe(v => {
          if(!v){
             valid = v;
             }
          });    
       });

如果在 foreach 循环之后 valid 仍然为真,它会继续收集对象。但是,我认为这是不正确的,因为 foreach 循环可能在所有可观察对象发出值之前完成。我也不确定将多个订阅分配给同一个变量的效果。

除了简单地使 validate() 方法返回一个常规布尔值之外,还有更好的方法吗?像 forkjoin 这样的东西会更好吗,其中 foreach 循环只是将所有可观察对象分叉在一起并发出一个数组?

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    您可以使用forkJoin

    当所有 observables 完成后,发出每个 observables 最后发出的值。


    import { forkJoin } from 'rxjs/observable/forkJoin';
    
    const allObs = forkJoin(...children.map(r => r.validate()));
    allObs.subscribe(res => console.log(res)); // Do what you want with the array of results
    

    【讨论】:

    • 好的,太好了!这也是我的倾向,我只是不确定它的“正确性”。虽然我有你的耳朵,但我可以问一下 - 你通常以这种方式在整个应用程序中使用 observables 吗?我是 rxjs 和 Angular 的新手,但是可组合的异步数据流的想法听起来很吸引人,所以这就是我的目标,但有时感觉有点混乱。
    • @Qumbaala 在大多数情况下,使用 RxJS(以及一般的 Observables)绝对是一个好主意,尤其是当您的应用程序的主要工作是对数据执行操作、传递数据并重复时,所有这些都以异步方式进行(大多数应用程序通常都是这种情况)。看看 this 优秀的响应式编程指南
    • 一开始会觉得凌乱的原因是它通常需要转变思维方式,因为 RxJS 与人们习惯的做事方式完全不同。你会很快习惯的
    • 感谢您的帮助!我每周大约使用 45 小时的淘汰赛,虽然它确实有计算/可观察的概念,但 rxjs 是这个想法的更强大的实现。不过你是对的,我使用它越多,我就越喜欢它。他们似乎是每个场合的运营商。再次感谢!
    猜你喜欢
    • 2023-03-24
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多