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

Angular2 and RxJS : Replace Observable Response by another Observable Response using Map

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

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

基本上,我遵循这些方案(在扩展 class 的 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)
    }
});

问题在于,由于范围的原因,我不知道如何在第一个地图中 return res2,所以对订阅者的响应 return 是它所期望的。

请求已成功启动,服务器 returns 200 所以一切都很好,但订阅者没有收到响应。

您需要展平流才能在主流中获得第二个响应。 由于非 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 而不是 mapRx.Observable.of 中的包装