javascript - 如何以非阻塞方式组合可观察对象?

标签 javascript angular rxjs

我有一个 Observable 集合,每个 Observable 可以检索不同的数据类型。我正在链接那些 Observable 以获得我想要的页面的所有数据。 事实上,所有这些信息都是独立的,因此加载一个信息不应阻塞或干扰其他信息的加载。这是我无法实现的。

这是我目前所做的示例:

  getAll(): Observable<any[]> {
    return this.getHome().pipe(
      tap((home: Home) => this.application = home),
      mergeMap((home: Home) =>
        combineLatest([
          this.getAssets(home.images).pipe(defaultIfEmpty([])),
          this.getStyling(home.styling).pipe(defaultIfEmpty({})),
          this.getCategories(home.categories).pipe(defaultIfEmpty([])),
        ])
      )
    );
  }

在这里,Observable 被成功链接,所以我得到了我想要的所有数据,但是 combineLatest() 在上一个请求完成后执行下一个请求,并且父级在一切完成后发出收集的数据这会造成延迟。 我一直在尝试使用 merge() 而不是 combineLatest() 以便收到的每个数据立即将其发送到父 Observable,但显然我做不到那个

那么,我如何设法链接这些 Observable,以便子 Observable 中的每个提交都直接发送到父 Observable?

最佳答案

你需要forkJoin , 它返回一个 Array每个Observable的结果(与 forkJoin 参数的顺序相同。

  getAll(): Observable<any[]> {
    return this.getHome().pipe(
      tap((home: Home) => this.application = home),
      mergeMap((home: Home) =>
        forkJoin(
          this.getAssets(home.images).pipe(defaultIfEmpty([])),
          this.getStyling(home.styling).pipe(defaultIfEmpty({})),
          this.getCategories(home.categories).pipe(defaultIfEmpty([]))
        )
      )
    );
  }

关于javascript - 如何以非阻塞方式组合可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56561510/

相关文章:

javascript - 从 iframe 更改父页面元标记

javascript - Angular 7 map 运算符无法与 httpClient Observable 一起使用

javascript - Promise resolve 后如何正确测试 setTimeout

javascript - 如何将数据附加到 mongodb 中的对象属性

angular - 组件内的组件 Angular

Angular - 输入值更改时不会触发 Google 位置指令

angular - 如何在 Angular 2 中为 cookie 添加过期时间(以小时为单位)?

angular - 如何处理 Resolver 中的错误

Angular "APP_INITIALIZER"在 Angular 4 中有没有 promise 的服务?

javascript - webpack 错误配置。模块具有未知属性 'loaders'