我正在扩展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,因此一切正常,但订阅者没有收到回复。
答案 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
中的包裹