4

在这个rxjs 示例中,atakeUntil用于该switchMap部分。我删除了它并且可观察的工作正常。

为什么在这个例子takeUntil中 the和 thenextSearch$是必要的?

@Injectable()
export class BookEffects {

  @Effect()
  search$: Observable<Action> = this.actions$
    .ofType(book.ActionTypes.SEARCH)
    .debounceTime(300)
    .map(toPayload)
    .switchMap(query => {
      if (query === '') {
        return empty();
      }

      const nextSearch$ = this.actions$.ofType(book.ActionTypes.SEARCH).skip(1);

      return this.googleBooks.searchBooks(query)
        .takeUntil(nextSearch$)
        .map(books => new book.SearchCompleteAction(books))
        .catch(() => of(new book.SearchCompleteAction([])));
    });

    constructor(private actions$: Actions, private googleBooks: GoogleBooksService) { }
}
4

1 回答 1

4

这里takeUntil用于将返回的 Observable 转换为新的 Observable,如果辅助 observable 在返回结果GoogleBooksService.searchBooks()之前发出任何内容(用户的新搜索请求操作,从外观上看),该 Observable 将被中断(即提前完成)searchBooks,有效防止订阅永远触发。如果后面的 http 请求在searchBooks用户发出新请求之前完成,这不会有什么不同,这也将完成 observable,但只有触发订阅之后。95% 的时间都应该是这种情况。

等待直到第二takeUntil个 Observable 发出一些东西(我认为这将是用户的下一个SEARCH 操作,当前使用 跳过skip(1))然后关闭 Observable,在它被触发之前销毁它的订阅,可能是因为一个新的 BookEffects 被实例化来处理新的搜索。

免责声明:我没有浏览所有应用程序的源代码,所以其中一些是猜测,但我相信它至少朝着正确的方向发展。

于 2017-03-04T14:59:34.830 回答