【发布时间】:2017-12-16 20:55:31
【问题描述】:
我的场景是一个带有搜索表单和结果列表的经典网页。我想将加载结果的行为封装在 Observable 中。
这是我目前在 TypeScript 中所做的:
function loadResults(query): Observable<T[]> {}
const results = new Subject<ResultEvent<T[]>>();
const results: Observable<ResultEvent<T[]>> =
form.valueChanges
.distinctUntilChanged()
.do(() => results.next(ResultEvent.pending()))
.switchMap(query => loadResults(query))
.subscribe({
next: (data: T[]) => results.next(ResultEvent.present(data)),
error: err => results.next(ResultEvent.failed(err)),
});
这个想法是results 始终包含搜索的当前状态:pending、present 或failed。当查询发生变化时,结果设置为pending,当服务返回数据时,结果设置为present。
我不喜欢这个解决方案的地方是对subscribe() 的显式调用。我宁愿有一个简单的Observable 可以订阅和取消订阅(例如在Angular 中使用async 管道),而无需创建显式订阅。 do 中的副作用看起来也很老套。
const results: Obserbable<ResultEvent<T[]>> =
form.valueChanges.distinctUntilChanged()
. /* here be dragons */;
感谢您的任何建议和想法!
【问题讨论】: