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 的顶部添加一些特定的导入以使用函数 timeoutWithObservable.throwimport 'rxjs/add/operator/timeoutWithimport 'rxjs/add/observable/throw 就像在 official Angular2 doc 中解释的那样。