我有一个TypeScript / Angular 2 Observable,第一次调用它时效果很好。但是,我有兴趣将多个订阅者附加到同一个observable,并以某种方式刷新可观察的和附加的订阅者。这就是我所拥有的:
query(): Rx.Observable<any> {
return this.server.get('http://localhost/rawData.json').toRx().concatMap(
result =>
result.json().posts
)
.map((post: any) => {
var refinedPost = new RefinedPost();
refinedPost.Message = post.Message.toLowerCase();
return refinedPost;
}).toArray();
}
假设有一个刷新按钮,当按下该按钮时,重新执行此observable,并且连接到它的任何订阅者都会获得一组更新的数据。
我该如何做到这一点?
答案 0 :(得分:4)
我不太了解Angular2和Typescript,但是打字稿是javascript的超集,我做了以下假设(让我知道,如果我错了),这应该使以下的javascript代码工作:
server.get
返回一个promise(或数组或Rx.Observable)posts
是post
您需要从该按钮上的click事件创建一个observable,将该点击映射到您的GET
请求,其余部分应该或多或少地写下来。我无法测试它,但它应该遵循这些方针:
// get the DOM id for the button
var button = document.getElementById('#xxx');
// create the observable of refined posts
var query$ =
Rx.Observable.fromEvent(button, 'click')
.flapMapLatest(function (ev) {
return this.server.get('http://localhost/rawData.json')
})
.map(function (result){return result.json().posts})
.map(function (posts) {
return posts.map(function(post){
var refinedPost = new RefinedPost();
refinedPost.Message = post.Message.toLowerCase();
return refinedPost;
})
})
.share()
// subscribe to the query$. Its output is an array of refinedPost
// All subscriptions will see the same data (hot source)
var subscriber = query$.subscribe(function(refinedPosts){console.log(refinedPosts)})
一些解释:
server.get
的调用,该调用返回一个可观察兼容的类型(数组,promise或observable)。返回的observable被展平以从该调用中提取result
posts
的数组,并从中创建一个refinedPost
数组。最后,每次点击都会产生一个refinedPost
数组,我认为这是你想要的让我知道我的假设是否正确以及这是否适合你。
此外,我建议您查看https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
除了能够很好地提醒这些概念之外,它还解决了与您非常相似的刷新服务器调用问题。