我有一个与api服务器交互的服务。它有myHttpPost(数据)方法。这种方法应该:
我方法的当前版本是:
postData(path: string, data: Object): Rx.Observable<any> {
let json = JSON.stringify(data);
return this.http.post(path, json)
.map(res => res.json())
}
这不是从上面的列表中执行第3点,因为map仅在成功时调用,而不是在出错时调用。我可以通过添加:
来更改序列.catch(error => {
let myError = prepareErrorContent(error);
return Rx.Observable.throw(myError);
});
然后订阅者(另一个服务)收到myError(确定)但是rxjs文档说明了以下关于catch()方法:&#34;继续一个由异常终止的可观察序列使用下一个可观察序列。&#34; 但我希望序列正常终止而不是继续。如果我使用上面的catch()
,那么从订阅者下一次调用postData()将不起作用(它会立即返回相同的错误,而不是进行http调用)。我认为这是因为序列没有终止。
怎么做?
[编辑] 这是我使用此服务的订阅者方法:
this.jsonHttp.postData(path, data)
.subscribe(
struct => onNext(struct),
error => {
let message = this.jsonHttp.extractError(error);
onError(message)
},
() => onComplete ? onComplete() : null
);
答案 0 :(得分:18)
实际上,对于每个HTTP请求,都会创建并执行处理链。收到回复后(成功和出错),链完成。
如果您执行两次请求,则它们之间没有链接。当两个请求都属于同一个处理链时,您可以拥有一些链接。例如,当使用flatMap
或switchMap
等可观察的运算符时。这是一个示例:
return this.http.get(...)
.map(res => res.json())
.flatMap(jsonData => {
// Can leverage the result of the previous request
return this.http.get(...).map(res => res.json());
});
发生错误时,处理链断开,并调用catch
运算符。您可以在关联的回调中返回一个observable来继续处理链。它可以是经典的可观察的,也可以是Observable.throw
的错误。在Angular2中的HTTP请求的上下文中,状态代码不同于2xx的响应被视为错误。
返回Observable.throw
时,调用订阅时指定的第二个回调。如果它是另一个可观察的,则调用第一个回调。例如:
return this.http.get(...)
.map(res => res.json())
.catch(res => {
// The error callback (second parameter) is called
return Observable.throw(res.json());
// The success callback (first parameter) is called
// return Observable.of(res.json());
});
我实现了一个执行请求(单击按钮)而没有身份验证标头的plunkr,因此收到401状态代码。再次单击时,会添加标头,因此会收到200状态代码。只是为了告诉你这两个请求之间没有关系。
请参阅此plunkr:https://plnkr.co/edit/5WwWpwjvQmJ4AlncKVio?p=preview。