Rxjs Observable:通过一个API调用订阅不同的值

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()方法加载列表的事实。

+0

Hi @ paulpdaniels。我用一些例子更新了我的问题。 – jobou

如果你只需要运行一次就可以直接缓存值:

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,它可能会连接到按钮事件,以便每个按钮单击都会触发新的请求。

+0

您的第二个解决方案正是我所期待的。谢谢。我不知道'pluck'方法,并且无法在文档中找到它。 – jobou

+0

我不得不在源码上使用'share'来防止查询发出2次。 – jobou

+0

'cache'就是'share' +'replay',所以它们的功能应该是一样的。 – paulpdaniels