为什么在这个ngrx例子中有必要使用until?

时间:2017-03-04 13:33:07

标签: angular ngrx ngrx-effects

在此rxjs example中,takeUntil部分使用了switchMap。我删除了它,并且可观察的工作正常。

为什么takeUntil需要nextSearch$@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) { } }

forename = input('Forename: ')
surname = input('Surname: ')

email = forename[0] + "." + surname + "@TreeRoad.net"
print ("This is the students email address:" + email)

1 个答案:

答案 0 :(得分:4)

此处的takeUntil用于将GoogleBooksService.searchBooks()返回的Observable转换为新的Observable,如果辅助observable发出任何内容,则会被中断(即过早完成)(新的搜索请求操作用户,通过它的外观)searchBooks返回结果,有效地防止订阅永远触发。如果searchBooks后面的http请求在用户发出新请求之前完成,那么它将不会产生影响,这也将完成observable,但只有触发订阅之后。这应该是95%的情况。

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

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