背景:我正在执行@ NGRX /效应中的@ NGRX /存储项目和研究示例应用程序。
问题:在BookEffects类文件的第50行中,为什么takeUntil(...)
使用代替take(1)
?在这种情况下,两者似乎都可以完成相同的任务。
@Injectable()
export class BookEffects {
constructor(private actions$: Actions, private googleBooks: GoogleBooksService) { }
@Effect()
search$: Observable = 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图书服务文件:
@Injectable()
export class GoogleBooksService {
private API_PATH: string = 'https://www.googleapis.com/books/v1/volumes';
constructor(private http: Http) {}
searchBooks(queryTitle: string): Observable {
return this.http.get(`${this.API_PATH}?q=${queryTitle}`)
.map(res => res.json().items || []);
}
retrieveBook(volumeId: string): Observable {
return this.http.get(`${this.API_PATH}/${volumeId}`)
.map(res => res.json());
}
}
cartant.. 5
要了解为什么takeUntil
要使用它,可能不做关于的实现的任何假设searchBooks
。
该searchBooks
服务方法返回一个可观察的Book[]
。该可观察性不一定必须完成;例如,如果数据库发生更改,它可能会发出其他结果(Firebase的AngularFire2可观察对象就是这种情况)。但是,如果take(1)
使用,后续结果将被忽略。如果takeUntil
使用,则后续结果将继续起作用,直到启动下一个搜索为止。
但是,我认为并不是takeUntil
必不可少的,因为switchMap
遗嘱会处理事情(内部可观察的对象将不被订阅,等等)。
的作者(S)example-app
出现在这样的方式已经实现了搜索的效果,这是不依赖于服务的实现。
使用的简单的,Http
基于的实现searchBooks
,我看不到为什么需要一个take(1)
或为什么要这样做takeUntil
-因为可观察的对象将完成,并且switchMap
将确保SearchCompleteAction
不会发出过时的搜索动作。
要了解为什么takeUntil
要使用它,可能不做关于的实现的任何假设searchBooks
。
该searchBooks
服务方法返回一个可观察的Book[]
。该可观察性不一定必须完成;例如,如果数据库发生更改,它可能会发出其他结果(Firebase的AngularFire2可观察对象就是这种情况)。但是,如果take(1)
使用,后续结果将被忽略。如果takeUntil
使用,则后续结果将继续起作用,直到启动下一个搜索为止。
但是,我认为并不是takeUntil
必不可少的,因为switchMap
遗嘱会处理事情(内部可观察的对象将不被订阅,等等)。
的作者(S)example-app
出现在这样的方式已经实现了搜索的效果,这是不依赖于服务的实现。
使用的简单的,Http
基于的实现searchBooks
,我看不到为什么需要一个take(1)
或为什么要这样做takeUntil
-因为可观察的对象将完成,并且switchMap
将确保SearchCompleteAction
不会发出过时的搜索动作。