首页 > 解决方案 > 用其他 observable 的结果初始化 observable

问题描述

我有 2 个请求。

  1. getCurrentBook(): Observable<Book>
  2. getDetailedInfo(bookId): Observable <BookDetailed>

它们都返回带有信息的可观察对象,但是要使用第二个请求,我必须确保我收到了来自第一个请求的信息,因为bookId它在响应中。

我知道我可以在其他订阅中订阅,但是这个解决方案似乎对我没有吸引力。必须有一个更优雅的方式。

现有的解决方案

getCurrentBook().subscribe(res => {
  getDetailedInfo(res.id).subscribe(...);
})

我知道它应该看起来像:

booksSubs = getCurrentBook().pipe(
  map(res => 
    {this.currentBook = res}
   )
  )
detailedSubs = getDetailedInfo(this.currentBook.id).pipe(
  map(res => 
    {this.detailed = res}
   )
  )

this.subscriptions.push(SOME OPERATOR(booksSubs, detailedSubs).subscribe();

但是更高的选项不起作用,因为我需要第一个可观察的结果来初始化第二个。

标签: rxjsobservable

解决方案


您可以使用一些“扁平化”运算符来实现它,例如mergeMap

const currentBookDetails$ = getCurrentBook().pipe(
  mergeMap(book => getDetailedInfo(book.id))
);

推荐阅读