首页 > 解决方案 > 从函数返回 Observable

问题描述

我在打字稿中有以下功能:

getConfigurations() {
    let sessionConfig = sessionStorage.getItem('config');
    if(config)
        return of(sessionConfig);
    else {
        this.dataService.getRoute('configurations').subscribe(
        route => this.http.get<any[]>(route.ToString()).subscribe(
            result => {
                sessionStorage.setItem('config', result);
                return of(result);
            },
            error => {
                alert(error);
            }),
        error => {
            alert(error);
        }
        );
    }
}

如果 sessionStorage 键已经存在,该函数应该返回一个字符串,或者使用 dataService 从后端检索值,然后在会话中设置该值。我也想返回 sessionStorage 中设置的值(结果),但我找不到办法。

来自 dataService 的函数 getRoute 是:

getRoute(service: string){
    return this.http.get('urlToMyBackendWebApi');
}

其中 http 是 Angular HttpClient。

如何获取从 getConfigurations() 返回的值?

我尝试订阅 getConfigurations。我对 if 条件没有任何问题(返回字符串 sessionConfig)但是如何从 else 条件中获取结果?我应该返回整个部分的 observable 吗?在这种情况下,我如何阅读退货?

标签: javascriptangulartypescriptrxjs

解决方案


不要订阅 observable,返回它,并使用tap操作符来存储响应:

getConfigurations() {
    let sessionConfig = sessionStorage.getItem('config');
    if(config)
        return of(sessionConfig);
    else {
        return this.dataService.getRoute('configurations').pipe(
          mergeMap(route => this.http.get<any[]>(route.ToString()),
          tap(result => sessionStorage.setItem('config', result))
        );
    }
}

推荐阅读