2017-06-20 38 views
1

我使用角2,離子2angular2 http.post到關閉服務器=>在Android返回錯誤但不是在IOS

我關閉我的應用程序發送其請求到服務器,以檢查如何管理離線模式。

我已根據import { Http, Headers, Response, RequestOptions, RequestMethod, Request } from '@angular/http'爲我的項目製作了自定義HTTP服務。它包括一個 '功能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 
     ); 
    } 

和 '功能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錯誤地址爲0的URL響應爲空:

但在IOS上,錯誤永遠不會到來,就像沒有時間設置一樣。有小費嗎?

回答

0

我解決了這個問題,在我的函數中添加了像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); 

} 

而且它需要在類的頂部添加一些特定進口使用功能timeoutWithObservable.throwimport 'rxjs/add/operator/timeoutWithimport 'rxjs/add/observable/throw像它在official Angular2 doc解釋。

0

我個人更喜歡使用@ angular/http這個fomart來處理錯誤,並且它始終都能正常工作。

this.http.post(url, data) 
    .map(res => res.json()) 
    .subscribe((data) => { 
     // Use returned data 
    }, 
    (err) => { 
      // Handle the error here 
      }); 

即使服務器處於脫機狀態,(err)部件也可幫助處理所有與網絡有關的錯誤。希望這可以幫助。

+0

它給出了和以前相同的結果。錯誤在Android中顯示,但不在IOS上顯示。 – nyluje

+0

您是否嘗試在Safari瀏覽器中爲應用程序提供服務以查看http錯誤處理是否正常 –

+0

我在SAFARI中進行了'ionic serve'測試,得到同樣的問題。它確實在控制檯上顯示一條警告消息,表明請求已超時,但該消息與我的代碼無關。它不會觸發'.catch(this.handleErrorObservable)'並且不會通過'console.log(...)'顯示錯誤。至少通過Apple瀏覽器的錯誤是一致的。 – nyluje

相關問題