RXJS收听首次订阅

时间:2019-03-01 17:15:19

标签: rxjs rxjs6

我有一个可观察性包装带有错误处理的函数,但为此,一旦订阅了内部可观察性,我需要运行一些代码。

我还需要取消较高的Observable,以取消内部的HTTP,因为它正在执行HTTP调用。

上下文

slideshow: string[] = [];
currentIndex = 0;
private is = {
    loading: new BehaviorSubject(false),
}

private loadImage(src: string): Observable;

private loadNextImage(index = this.currentIndex, preload = false): Observable<number> {
    const nextIndex = (index + 1) % this.slideshow.length;
        if (this.currentIndex == nextIndex) {
        if (!preload) {
            this.is.loading.next(false);
        }
        throw new Error('No other images are valid');
    }

    return ( possible code below )
}

Defer-这很好,直到我意识到这将为每个订阅者创建一个新实例。

defer(() => {
    if (!preload) {
        this.is.loading.next(true);
    }
    return this.loadImage(this.slideshow[nextIndex]).pipe(
        finalize(() => {
            if (!preload) {
                this.is.loading.next(false);
            }
        }),
        map(() => nextIndex),
        catchError(err => this.loadNextImage(nextIndex)),
    );
});

Of(void 0).pipe(mergeMap(...))-这确实应该做,但确实很丑

of(void 0).pipe(
    mergeMap(() => {
        if (!preload) {
            this.is.loading.next(true);
        }

        return this.loadImage(this.slideshow[nextIndex]).pipe(
            finalize(() => {
                if (!preload) {
                    this.is.loading.next(false);
                }
            }),
            map(() => nextIndex),
            catchError(err => this.loadNextImage(nextIndex)),
        );
    }),
)

new Observable-我认为应该有一个我找不到的解决方案

0 个答案:

没有答案