javascript - 取消订阅 RxJS 后有没有办法重新订阅?
问题描述
这是一个订阅 Http 请求并在鼠标单击页面时取消它的示例代码。如果我再次单击,我想重新订阅。
如何切换订阅? 小提琴
export class AboutComponent implements OnInit {
constructor(private http:HttpClient){
}
flag=true;
documentclick = fromEvent(document, 'click');
private data = {
name: 'Samurai',
profession: 'Developer'
};
ngOnInit(){
let subscription:Subscription = this.getGoogle() )
.subscribe((res)=> {
console.log(res);
})
this.documentclick.subscribe( e=>{
if(this.flag){
subscription.unsubscribe();
}
else{
subscription = this.getGoogle().subscribe((res)=> {
console.log(res);
});
}
this.flag != this.flag;
});
}
getGoogle(): Observable<any> {
return this.http.get( 'https://jsonplaceholder.typicode.com/todos/1').pipe ( delay( 2000 ) )
}
}
使用上面的代码,如果我在 2 秒内单击页面,我可以取消请求。但我无法再次点击再次订阅。
另外,如果有人能告诉我我是否真的用 unsubscribe() 取消了 http 请求,那就太好了?或者这只是一种错觉?如果我在 2 秒内取消订阅,请求会到达服务器吗?
解决方案
你的代码有一个逻辑错误,我认为只是一个错字。
this.flag != this.flag;
你可能是说
this.flag = !this.flag;
顺便说一句(与您的问题无关),您获得文档点击的方法是一种非角度的方式,您可能会遇到页面未更新的问题。考虑改用 HostListener:
@HostListener('document:click', ['$event'])
clicked(event) {
..
}
取消订阅 HTTP 请求应取消该请求。但是,您无法保证知道请求是否真的通过了服务器 - 在您取消订阅时服务器可能已经回复了。
这是一个清理过的 stackblitz:https ://stackblitz.com/edit/angular-fzlzcf
推荐阅读
- neo4j - 在 Neo4J 中“计数”操作后返回相同的路径
- hibernate-validator - Hibernate 验证器为@Email 使用的正则表达式模式到底是什么?
- html - 将表格的值从一个jsp页面(html中的表格数据)传递到另一个jsp页面中的另一个表格
- node.js - 护照认证什么都不做
- react-native - “反应 - 本机链接错误文件 C:\Users\pc\AppData\Roaming\npm\react-native.ps1 无法加载”
- c# - 从外部 Page 添加到 ObservableCollection 的新元素不会被持久化
- interface - 如何在 UML 组件图中找出组件的正确接口?
- r - 显示存储在列表中的图,禁止将名称和索引打印到控制台
- c++ - macdeployqt 不验证应用程序
- aws-amplify - Amplify Web Hosting 默认使用 CloudFront CDN 吗?