0

我有这个可观察的 http 请求

refreshToken() {
    return this.http.get(this.siteService.apiDomain() + '/api/token?token=' + localStorage.getItem('JWToken'), {})
        .map((response: Response) => {
            return response;
        })
}

我这样称呼可观察者

return this.refreshTokenService.refreshToken()
                .flatMap((result: any) => {
                    // if got new access token - retry request
                    if (JSON.parse(result._body).token) {
                        localStorage.setItem('JWToken', JSON.parse(result._body).token);
                    }
                    this.setHeaders(url);
                    return this.request(url, options);
                })

我的问题是,如果我有多个并行请求,我会多次执行 refreshToken()。我想找到一种方法来进行虚假的 http 调用,并返回我已经知道的令牌或什么都不返回。

Observable.empty() // Failed to compile (Type '{}' is not assignable to type 'Response'.)
Observable.empty().filter(() => {return true}) // Compiles but it stop the flatMap sequence.
4

2 回答 2

0

我不确定我是否完全理解,但也许你想要Observable.of()

这是我使用它的一个例子。如果 Id 为 0,则返回一个已初始化的产品作为 Observable。

import 'rxjs/add/observable/of';
...

getProduct(id: number): Observable<IProduct> {
    if (id === 0) {
        return Observable.of(this.initializeProduct());
    };
    const url = `${this.baseUrl}/${id}`;
    return this.http.get(url)
        .map(this.extractData)
        .do(data => console.log('getProduct: ' + JSON.stringify(data)))
        .catch(this.handleError);
}
于 2017-07-17T20:34:41.520 回答
0

我建议使用 BehaviourSubjects,它允许您存储最后一个值,直到组件被破坏或您面对它改变。同样当 BehaviourSubject 的值发生变化时;每个订阅它的组件也会收到新数据。另外,作为一个额外的好处,您不需要每次都调用服务器,因为组件想要获取像 Observable 这样的值,因为它存储了值,您可以随时获取值而无需调用服务器。 行为对象示例

于 2017-07-17T20:36:17.153 回答