为什么在此 ngrx 示例中需要 takeUntil?

Why takeUntil is necessary in this ngrx example?

在此rxjs example中,switchMap部分使用了takeUntil。我删除了它,Observable 工作正常。

为什么 takeUntilnextSearch$ 在这个 example 中是必要的?

@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) { }
}

这里的takeUntil用于将GoogleBooksService.searchBooks()返回的Observable转换为一个新的Observable,如果辅助observable发出任何东西(一个新的搜索请求),它将被中断(即过早完成)用户的操作,从外观上看)在 searchBooks returns 结果之前,有效地阻止了订阅的触发。如果 searchBooks 后面的 http 请求在用户发出新请求之前完成,这也将完成 observable,但只有 after 触发订阅,这不会有什么不同。这应该是 95% 的情况。

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

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