为什么在此 ngrx 示例中需要 takeUntil?
Why takeUntil is necessary in this ngrx example?
在此rxjs example中,switchMap
部分使用了takeUntil
。我删除了它,Observable 工作正常。
为什么 takeUntil
和 nextSearch$
在这个 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 来处理新的搜索。
免责声明:我没有查看应用程序的所有源代码,所以其中一些是猜测,但我相信它至少朝着正确的方向发展。
在此rxjs example中,switchMap
部分使用了takeUntil
。我删除了它,Observable 工作正常。
为什么 takeUntil
和 nextSearch$
在这个 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 来处理新的搜索。
免责声明:我没有查看应用程序的所有源代码,所以其中一些是猜测,但我相信它至少朝着正确的方向发展。