编写一个可以订阅的observable并进行一次http调用

时间:2018-06-18 17:53:20

标签: angular observable

我来自一个angularjs世界,起初之前我能做的事似乎是翻译但是在检查网络之后,我正在接听多个电话。

在anguylarjs中,我会在服务中做到这样的事情:

function call(){
    if(service.promise){
        return service.promise
    };
    service.promise = http.get(...)
        .then(function(){
            ...
            return ...;
        }, function(){
            ...
        });
    return service.promise;
}

要打电话就很简单

call(); //fires the http call
call(); //does not fire the http call again

我尝试用角度中的observable复制它,但http调用总是为每个订阅触发:

call(): Observable<...>{
    if(service.observable){
        return service.observable;
    }

    service.observable = this.httpClient.get<...>(...)
        .flatMap(data => {
            ...
            return of(...);
        });

    return service.observable;
}

因此,如果我订阅了两次,它总是在进行http调用

call() //fires the http call
    .subscribe((data) => {
        console.log(data);
    })
call() //fires the http call again
    .subscribe((data) => {
        console.log(data);
    })

我也可以在这里做反模式。

1 个答案:

答案 0 :(得分:0)

根据@JB Nizet在上述评论中的建议,我重新调整了对此的呼吁:

call(): Observable<...>{
    if(service.observable){
        return service.observable;
    }

    service.observable = this.httpClient.get<...>(...)
        .pipe(
            map(data => {
                ...
                return ...;
            }),
            shareReplay(1)
        );

    return service.observable;
}