typescript - 是否可以在 rxjs6 和 Angular 中共享订阅事件?
问题描述
我有简单地调用 api 的服务类。此服务类正在组件中使用。有没有办法让消费组件知道服务 api 的订阅何时完成?
现在我正在从消费组件向服务发送回调函数。回调函数是订阅函数的参数之一,这是我的理解。
class MyService {
constructor(httpClient: HTTPClient){}
fetchDetails (id, callback) {
this.http.get('my/api/endpoint/url').subscribe(
response => {
// do something with response
}
error => { //do some processing for error}
() => callback() // called when subscribe is done
)
}
}
class MyList {
constructor(myservice: MyService){}
getDetails (id) {
this.myservice.fetchDetails(id, this.detailsFetched);
}
detailsFetched () {
// subscribe complete
// do some processing like route to a state
}
}
这目前对我有用,但不知何故,我觉得必须有更好的方法来做我想做的事。由于我是 rxjs 的新手,我无法理解如何实现它。
解决方案
您的解决方案是正确的,作为替代方案,我可以建议使用更具声明性的 RxJS 方式来编写类似的内容。
import { HttpClient } from '@angular/common/http';
import { shareReplay, finalize } from 'rxjs/operators';
import { Observable } from 'rxjs';
class MyService {
constructor(private http: HttpClient) {}
fetchDetails(id): Observable<any> {
const stream$ = this.http
.get(`my/api/endpoint/url/${id}`)
.pipe(shareReplay());
stream$.subscribe(
(response) => {
console.log(response);
},
(error) => {
console.log(error);
},
() => {
console.log('completed');
},
);
return stream$;
}
}
class MyList {
constructor(private myservice: MyService) {}
private getDetails(id) {
this.myservice
.fetchDetails(id)
.pipe(finalize(() => this.detailsFetched()))
.subscribe();
}
private detailsFetched() {
// subscribe complete
// do some processing like route to a state
}
}
总而言之,您可以看到我是从 中返回Observable
的fetchDetails()
,它是用 创建的shareReplay()
。它的作用是shareReplay()
它只会创建 1 个网络调用并将其共享给订阅源 observable 的任何人,然后如果有人在 observable 完成后订阅,它将重播,以便以后的订阅者收到相同的事件。
还要看看我在getDetails
哪里使用finalize()
运算符来做你想做的事。当源 Observable 完成时,将调用传递给 finalize 运算符的回调。
推荐阅读
- python - 迁移和两个应用程序在不同机器上共享部分数据库
- elasticsearch - 如何通过查询更新以从 elasticsearch 6.4 中的排序查询创建递增排名
- c# - 缺少值属性.net core mvc HiddenFor helper
- android - 隐藏在键盘后面的 EditText
- python - 我们可以在 django 中使用 tornado 异步库在 django 视图中实现异步 Web 请求吗?
- sql-server - 并行聚集列存储索引构建
- c - 在 OpenCL 中检查两个字符向量是否相等?
- c# - 如何获取具有相同记录的列的行数
- java - 如何使用 ResponseEntity 返回 JSONObject 而不是 HashMap?(未找到类型返回值的转换器:类 org.json.JSONObject)
- sql - 如何在相关列上加入这两个选择语句 Microsoft SQL Server 2008