RxjsObservable:通过一个API调用订阅不同的值
Rxjs Observable : subscribe to different values with one API call
我有一个CRUD API,实体上的get返回当前过滤器配置的列表和项目总数。
例如: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
});
但我不喜欢这样,因为我不能将我的接口用于Post实体(或者我必须定义一个类似{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');
另一方面,如果您需要多次调用这些Observable,那么我建议您将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
,因此每次单击按钮都会触发一个新的请求。
相关文章:
- JQuery-重新加载Div并在点击时调用API
- 需要帮助调用API
- Froogaloop Vimeo API--Can't在就绪事件之外调用API方法
- Javascript:如何通过HTTPS和AJAX调用API
- 同步代码框 - 调用 API - 解析 JSON - 获取引用 - 保存新对象
- 为什么如果失败,我无法保留调用 api
- Cloudinary - 通过直接调用 API 上传,缺少文件
- 用户完成键入后,调整keyup事件以调用API
- 调用API中的API-jQuery/HHandlebars
- 当使用AJAX调用API时,网站在打开后重定向到index.php
- 在哪里调用API MVC模式
- 无法在JavaScript中调用api(跨源)
- Ajax没有在framework7的构建版本中调用API
- 如何使用node.js调用API,并在主体中包含JSON字符串
- 从CouchDB设计文档调用API
- 在路由器上点击时调用API
- 美元.试图调用API时出现错误
- AngularJS:服务调用API并返回JSON
- 如何在成功安装Firefox插件时调用API url
- 在后台调用API key,在WebExtension中调用内容脚本