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
而不是 map
和 Rx.Observable.of
中的包装
我正在扩展 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
而不是 map
和 Rx.Observable.of
中的包装