Rxjs Observable:通过一个API调用订阅不同的值
我有一个CRUD API,其中获取实体返回列表和当前过滤器配置的项目总数。Rxjs Observable:通过一个API调用订阅不同的值
例如:GET /posts
{
"items": [
{
"id": 1,
"title": "post title 1"
}
...
],
"total": 9
}
如何创建一个可观察该HTTP查询只执行一次,但在那里我可以订阅无论是总价值或物品清单?
我处在与打字稿的Angular2上下文中。
我第一次尝试这样做,它的工作:
this.http.get('/api/posts').map(response => response.json()).subscribe(data => {
var items = data.items
var total = data.total
});
但我不喜欢这样,因为我不能用我的界面后实体(或我必须定义一个接口一样,{items: Post, total: number}
这是不是真的优美)。我想要做的是这样的:
this.myPostService.totalObservable.subscribe(total => this.total = total)
this.myPostService.itemsObservable.subscribe(items => this.items = items)
但没有触发2个查询。
我看了一下这篇博文:https://coryrylan.com/blog/angular-2-observable-data-services但我不喜欢你先订阅然后调用list()方法加载列表的事实。
如果你只需要运行一次就可以直接缓存值:
var source = this.http.get('/api/posts').map(response => response.json()).publishLast();
//unsubscribe from this when you are done
var subscription = source.connect();
然后你就可以露出两个来源为:
var totalObservable = source.pluck('total');
var itemsObservable = source.pluck('items');
如果在另一方面,你需要多次呼叫这些Observables,那么我会建议您将get
包装在触发的Observable和缓存中:
var source = sourceTrigger
.startWith(0) //Optionally initialize with a starting value
//This ensures that only the latest event is in flight.
.flatMapLatest(() => this.http.get('/api/posts'), (_, resp) => resp.json())
.cache(1);
//Again expose these items using `pluck`
var totalObservable = source.pluck('total');
var itemsObservable = source.pluck('items');
在第二种情况下,sourceTrigger
可能是Observable
,它可能会连接到按钮事件,以便每个按钮单击都会触发新的请求。
您的第二个解决方案正是我所期待的。谢谢。我不知道'pluck'方法,并且无法在文档中找到它。 – jobou
我不得不在源码上使用'share'来防止查询发出2次。 – jobou
'cache'就是'share' +'replay',所以它们的功能应该是一样的。 – paulpdaniels
Hi @ paulpdaniels。我用一些例子更新了我的问题。 – jobou