angular2 http.post 到关闭的服务器 => return 在 Android 上出错但不在 IOS 上
angular2 http.post to a turned off server => return error on Android BUT NOT ON IOS
我正在使用 Angular 2,Ionic 2。
我关闭了我的应用向其发送请求的服务器,以检查如何管理离线模式。
我已经基于import { Http, Headers, Response, RequestOptions, RequestMethod, Request } from '@angular/http'
为我的项目制作了自定义HTTP 服务。它包括一个 'function sendRequest':
public sendRequest = (data):Observable<Response> => {
// console.log("CustomHttpService->sendRequest() starts");
let headersToUse = new Headers();
headersToUse.append("Content-type",'application/x-www-form-urlencoded');
data = this.jsonToURLEncoded(data);
let options = { headers:headersToUse };
return this.http.post(this.url, data, options).map(
(res:Response)=>{
return res.json();
}
).catch(
this.handleErrorObservable
);
}
和 'function handleErrorObservable':
private handleErrorObsevable (error:Response|any){
console.log("handleError error.message " + error.message);
console.log("handleError error " + error);
return Observable.throw(error.message || error);
}
在 Android 中有效,一段时间后我进入日志:
handleError error Response with status 0 for URL: null
但是在 IOS 上,错误永远不会出现,就像没有设置超时一样。有什么建议吗?
我个人更喜欢使用@angular/http 的这种格式来处理错误并且它始终有效。
this.http.post(url, data)
.map(res => res.json())
.subscribe((data) => {
// Use returned data
},
(err) => {
// Handle the error here
});
(err)
部分有助于处理所有与网络相关的错误,即使在服务器离线时也是如此。希望这有帮助。
我通过在我的函数中像 in that SO question 这样的可观察对象添加自定义超时设置来解决它。现在看起来是这样的:
public sendRequest = (data):Observable<Response> | Observable<any> => {
// console.log("CustomHttpService->sendRequest() starts");
let headersToUse = new Headers();
headersToUse.append("Content-type",'application/x-www-form-urlencoded');
data = this.jsonToURLEncoded(data);
let options = { headers:headersToUse };
return this.http.post(this.url, data, options).timeoutWith(CustomHttpService.TIMEOUT_DELAY,Observable.throw(new Error(CustomHttpService.ERROR_REQ_HTTP))).map(
(res:Response)=>{
return res.json();
}
)
.catch(this.handleErrorObservable)
}
private handleErrorObservable (error:Response|any){
console.error(CustomHttpService.CLASS_TAG + " handlerErrorObservable: error.message " + error.message);
return Observable.throw(error.message);
}
还需要在 class 的顶部添加一些特定的导入以使用函数 timeoutWith
和 Observable.throw
:
import 'rxjs/add/operator/timeoutWith
和 import 'rxjs/add/observable/throw
就像在 official Angular2 doc 中解释的那样。
我正在使用 Angular 2,Ionic 2。
我关闭了我的应用向其发送请求的服务器,以检查如何管理离线模式。
我已经基于import { Http, Headers, Response, RequestOptions, RequestMethod, Request } from '@angular/http'
为我的项目制作了自定义HTTP 服务。它包括一个 'function sendRequest':
public sendRequest = (data):Observable<Response> => {
// console.log("CustomHttpService->sendRequest() starts");
let headersToUse = new Headers();
headersToUse.append("Content-type",'application/x-www-form-urlencoded');
data = this.jsonToURLEncoded(data);
let options = { headers:headersToUse };
return this.http.post(this.url, data, options).map(
(res:Response)=>{
return res.json();
}
).catch(
this.handleErrorObservable
);
}
和 'function handleErrorObservable':
private handleErrorObsevable (error:Response|any){
console.log("handleError error.message " + error.message);
console.log("handleError error " + error);
return Observable.throw(error.message || error);
}
在 Android 中有效,一段时间后我进入日志:
handleError error Response with status 0 for URL: null
但是在 IOS 上,错误永远不会出现,就像没有设置超时一样。有什么建议吗?
我个人更喜欢使用@angular/http 的这种格式来处理错误并且它始终有效。
this.http.post(url, data)
.map(res => res.json())
.subscribe((data) => {
// Use returned data
},
(err) => {
// Handle the error here
});
(err)
部分有助于处理所有与网络相关的错误,即使在服务器离线时也是如此。希望这有帮助。
我通过在我的函数中像 in that SO question 这样的可观察对象添加自定义超时设置来解决它。现在看起来是这样的:
public sendRequest = (data):Observable<Response> | Observable<any> => {
// console.log("CustomHttpService->sendRequest() starts");
let headersToUse = new Headers();
headersToUse.append("Content-type",'application/x-www-form-urlencoded');
data = this.jsonToURLEncoded(data);
let options = { headers:headersToUse };
return this.http.post(this.url, data, options).timeoutWith(CustomHttpService.TIMEOUT_DELAY,Observable.throw(new Error(CustomHttpService.ERROR_REQ_HTTP))).map(
(res:Response)=>{
return res.json();
}
)
.catch(this.handleErrorObservable)
}
private handleErrorObservable (error:Response|any){
console.error(CustomHttpService.CLASS_TAG + " handlerErrorObservable: error.message " + error.message);
return Observable.throw(error.message);
}
还需要在 class 的顶部添加一些特定的导入以使用函数 timeoutWith
和 Observable.throw
:
import 'rxjs/add/operator/timeoutWith
和 import 'rxjs/add/observable/throw
就像在 official Angular2 doc 中解释的那样。