![](/img/trans.png)
[英]Why are there two modules defined in the authentication module in the NgRx example app?
[英]Why takeUntil is necessary in this ngrx example?
在此rxjs例子 ,一個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) { }
}
此處的takeUntil
用於將GoogleBooksService.searchBooks()
返回的Observable轉換為新的Observable,如果輔助observable發出任何內容(用戶的新搜索請求操作,通過外觀,將會中斷(即過早完成)) it)在searchBooks
返回結果之前,有效地防止訂閱永遠觸發。 如果searchBooks
背后的http請求在用戶發出新請求之前完成,那么它也將沒有區別,這也將完成observable,但僅在觸發訂閱之后。 這應該是95%的情況。
takeUntil
等待直到第二個Observable發出一些東西(這里這將是用戶的下一個 SEARCH動作,我假設, 當前的一個被跳過使用skip(1)
)然后關閉Observable,在它之前銷毀它的訂閱被觸發,可能是因為新的BookEffects被實例化以處理新的搜索。
免責聲明:我沒有查看所有應用程序的源代碼,因此其中一些是猜測,但我相信它至少會朝着正確的方向發展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.