在此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)
答案 0 :(得分:4)
此处的takeUntil
用于将GoogleBooksService.searchBooks()
返回的Observable转换为新的Observable,如果辅助observable发出任何内容,则会被中断(即过早完成)(新的搜索请求操作用户,通过它的外观)searchBooks
返回结果,有效地防止订阅永远触发。如果searchBooks
后面的http请求在用户发出新请求之前完成,那么它将不会产生影响,这也将完成observable,但只有在触发订阅之后。这应该是95%的情况。
takeUntil
等待,直到第二个Observable发出一些东西(这是用户的 next SEARCH动作,我认为,当前一个使用skip(1)
跳过然后关闭Observable,在触发之前销毁它的订阅,可能是因为新的BookEffects被实例化以处理新的搜索。
免责声明:我没有查看所有应用程序的源代码,因此其中一些是猜测,但我确信它至少会朝着正确的方向发展。