gpt4 book ai didi

angular - 为什么在 Http 服务中使用 .takeUntil() 而不是 .take(1) ?

转载 作者:行者123 更新时间:2023-12-04 18:59:25 26 4
gpt4 key购买 nike

上下文:我正在实现 @ngrx/effects@ngrx/store项目和研究example app .

问题:BookEffects class file ,第 50 行,为什么是 takeUntil(...)用于代替 take(1) ?在这种情况下,两者似乎都完成了同样的事情。

@Injectable()
export class BookEffects {
constructor(private actions$: Actions, private googleBooks: GoogleBooksService) { }

@Effect()
search$: Observable<Action> = this.actions$
.ofType(book.ActionTypes.SEARCH)
.debounceTime(300)
.map((action: book.SearchAction) => action.payload)
.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([])));
});
}

这是 Google Books service file :

@Injectable()
export class GoogleBooksService {
private API_PATH: string = 'https://www.googleapis.com/books/v1/volumes';

constructor(private http: Http) {}

searchBooks(queryTitle: string): Observable<Book[]> {
return this.http.get(`${this.API_PATH}?q=${queryTitle}`)
.map(res => res.json().items || []);
}

retrieveBook(volumeId: string): Observable<Book> {
return this.http.get(`${this.API_PATH}/${volumeId}`)
.map(res => res.json());
}
}

最佳答案

了解原因 takeUntil使用时,对 searchBooks 的实现不做任何假设可能会有所帮助。 .
searchBooks service 方法返回一个可观察的 Book[] .该 observable 不一定要完成;例如,如果数据库发生变化,它可能会发出额外的结果(这就是 Firebase 的 AngularFire2 observables 发生的情况)。但是,如果 take(1)使用,后续结果将被忽略。如 takeUntil使用,后续结果将继续影响操作,直到启动下一次搜索。

但是,我不认为 takeUntil是必不可少的,因为 switchMap会处理事情(内部 observable 将被取消订阅等)。
example-app的作者似乎以不依赖于服务的实现的方式实现了搜索效果。

用简单的,Http基于 searchBooks 的实现,我不明白为什么 take(1)takeUntil将是必需的 - 因为 observable 将完成并且 switchMap将确保 SearchCompleteAction不会发出陈旧搜索的操作。

关于angular - 为什么在 Http 服务中使用 .takeUntil() 而不是 .take(1) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41657400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com