Angular2和RxJS:使用Map替换另一个Observable Response的Observable Response

时间:2017-06-14 12:27:25

标签: angular rxjs observable angular2-http

我正在扩展Angular Http对象以全局处理状态代码。

如果此状态为201,则响应对象包含用于身份验证的新令牌,并且由于它不包含已订阅该请求的组件所期望的结果,因此它还包含再次发出此请求的所有内容。 / p>

基本上,我遵循这些方案(在Http扩展类中):

return request(url, options).map((res: Response) => {
    if (res.status === 201) {
        this._authService.updateAuth(res.token);

        const newRequest = this.createNewRequest(res); // returns an Observable<Response> created with the Http.get or Http.post method

        newRequest.map((res2: Response) => {
            return res2; // I want res2 to replace res through the first map, but there is a scope problem
        });
    } else {
        return res; // In non 201 case I keep the first response (res)
    }
});

问题在于,由于范围我不知道如何在第一个映射中返回res2,因此返回给订阅者的响应是它所期望的响应。

请求已成功启动,服务器返回200,因此一切正常,但订阅者没有收到回复。

1 个答案:

答案 0 :(得分:6)

您需要展平流,以便在主流中获得第二个响应。 由于非201响应也将变平,您需要将其包含在一个可观察的内部。

以下是您的代码:

return request(url, options).mergeMap((res: Response) => {
    if (res.status === 201) { 
        return this.createNewRequest(res); // returning the new request's stream
    } else {
        return Rx.Observable.of(res); // wrapped inside an observable
    }
});

重要的部分是mergeMap而非map以及Rx.Observable.of中的包裹