Angular 角度异步管道重新订阅

Angular 角度异步管道重新订阅,angular,rxjs,observable,async-pipe,Angular,Rxjs,Observable,Async Pipe,我对Angular async管道的理解是,它订阅了HTML模板中的一个公开的可观察对象。例如 组成部分 export class TestComponent { let todos$: Observable<Array<Todo>>; constructor(private http: HttpClient) {} ngOnInit() { this.todos$ = this.http.get<Array<Tod

我对Angular async管道的理解是,它订阅了HTML模板中的一个公开的可观察对象。例如

组成部分

export class TestComponent {
    let todos$: Observable<Array<Todo>>;

    constructor(private http: HttpClient) {}

    ngOnInit() {
        this.todos$ = this.http.get<Array<Todos>>(...)
    }
}
还有错误

error(error)
completed
当一个可观察对象发出一个已完成的事件时,订阅关闭

因此,如果您订阅了像Angulars HttpClient observable这样的cold observable,您如何重试该HttpClient请求


async操作符进行初始订阅,但在cold observable完成后将立即关闭。如果要再次执行,如何让async操作符重新订阅?例如,如果您想刷新数据。

您有一个
重试
retryWhen
操作符。与他们一起玩:)

@编辑

要在成功时刷新数据,您可以这样做:


导出类TestComponent{
刷新$=新行为主体(true);
todos$:可观察的;
构造函数(私有http:HttpClient){}
恩戈尼尼特(){
this.todos$=this.refresh$
.烟斗(
switchMap(()=>this.http.get(…)
)
}
刷新数据(){
this.refresh$.next();
}
}

您有一个
重试
retryWhen
操作符。与他们一起玩:)

@编辑

要在成功时刷新数据,您可以这样做:


导出类TestComponent{
刷新$=新行为主体(true);
todos$:可观察的;
构造函数(私有http:HttpClient){}
恩戈尼尼特(){
this.todos$=this.refresh$
.烟斗(
switchMap(()=>this.http.get(…)
)
}
刷新数据(){
this.refresh$.next();
}
}

只需重新分配todos$,这将再次触发http请求

组成部分

导出类TestComponent{
公共TODO$:可见;
构造函数(私有http:HttpClient){}
恩戈尼尼特(){
这个。getTodos();
}
getTodos(){
this.todos$=this.http.get(…);
}
}
模板


Refresh只需重新分配todos$,这将再次触发http请求

组成部分

导出类TestComponent{
公共TODO$:可见;
构造函数(私有http:HttpClient){}
恩戈尼尼特(){
这个。getTodos();
}
getTodos(){
this.todos$=this.http.get(…);
}
}
模板


Refresh什么触发了新请求?例如,您可以有一个刷新按钮。如果我理解正确,异步操作符将需要再次订阅httpclient cold observable。是什么触发了新请求?例如,您可以有一个刷新按钮。如果我理解正确,异步操作符将需要再次订阅httpclient cold observable?我也在谈论成功的情景。如果我想从服务中刷新数据。感谢您提供此解决方案。这是将冷可观测转换为热可观测吗?如中所示,模板现在订阅了不发送完整事件的主题?那么todos$的订阅仍然有效吗?@FergalRooney,没错。请求已完成,但sub未完成。如果obseravble出错,情况似乎就是这样?我也在谈论成功的情景。如果我想从服务中刷新数据。感谢您提供此解决方案。这是将冷可观测转换为热可观测吗?如中所示,模板现在订阅了不发送完整事件的主题?那么todos$的订阅仍然有效吗?@FergalRooney,没错。请求已完成,但子系统未完成
next(value)
completed
error(error)
completed