1

我对 Angular 异步管道的理解是在 HTML 模板中为您订阅一个公开的 Observable。例如

零件

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

    constructor(private http: HttpClient) {}

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

模板

<div *ngFor="let todo of todos$ | async">
    {{ todo }}
</div>

我的理解是 HttpClient Observable 将发出以下事件以获得成功:

next(value)
completed

和错误

error(error)
completed

当一个 observable 发出一个完成的事件时,订阅就关闭了。

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

异步操作员进行初始订阅,但一旦冷可观察完成就会关闭,如果您想再次执行异步操作员,如何让异步操作员重新订阅?例如,如果您想刷新数据。

4

2 回答 2

4

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

零件

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

    constructor(private http: HttpClient) {}

    ngOnInit() {
     this.getTodos();
    }

    getTodos(){
        this.todos$ = this.http.get<Array<Todos>>(...);
    }
}

模板

<button (click)="getTodos()" >Refresh </button>

演示

于 2020-03-13T07:28:09.877 回答
1

你有一个retryretryWhen运算符。和他们一起玩:)

https://rxjs-dev.firebaseapp.com/api/operators/retry

https://rxjs-dev.firebaseapp.com/api/operators/retryWhen

@编辑

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


export class TestComponent {
    refresh$ = new BehaviorSubject(true);
    todos$: Observable<Array<Todo>>;

    constructor(private http: HttpClient) {}

    ngOnInit() {
        this.todos$ = this.refresh$
            .pipe(
                 switchMap(() => this.http.get<Array<Todos>>(...))
            )
    }

    refreshData() {
        this.refresh$.next();
    }
}
于 2020-03-13T07:15:55.430 回答