2017-10-06 6 views
1

私はAPIと通信し、そこからデータを取得するために、この形式をアプリケーションで使用しました。 service.tsの1角度サービスコードのリファクタリング

getCheckoutDetails(): Observable<UserDetail> { 
    let query = `7668`; 
    return this.http 
     .get(this.appConfig.getAPIUrl() 
      + `/buy/getDetails?${query}`) 
     .map(this.extractData) 
     .catch(this.handleErrors); 
} 


private extractData(res: Response) { 
    let data = res.json();  
    return data.body ? data.body.message ? data.body.message : {} : {}; 
} 

private handleErrors(error: Response | any) { 
    let errMsg: string; 
    if (error instanceof Response) { 
     const body = error.json() || ''; 
     const err = body.error || JSON.stringify(body); 
     errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
    } else { 
     errMsg = error.message ? error.message : error.toString(); 
    } 
    console.error(errMsg); 
    return Observable.throw(errMsg); 
} 

からのコードである今、私たちは、アプリケーションのコードの重複を検出するために、cpdを使用していて、それがどこに私がextractDataを使用していますと文句を言いに続き

handleErrorsコードが複製されています。

ベースクラスを使用してこれを処理するより良い方法はありますか?

+0

を){クエリ=「7668」としましょう。 return this.get( '/ buy/getDetails?$ {query}')} 'そして全てのロジックは内部ベースのサービスになりますか? – yurzui

+0

感謝@yurzui答えとして投稿してください。私はそれをマークします – Sajeetharan

答えて

1

あなたは、基本クラスにのようなもの、あなたの方法を移動することができます:あなたは `getCheckoutDetails(のようなものをしたいですか

class BaseService { 
    constructor(
    private http: Http, 
    @Inject(AppConfig) private appConfig: AppConfig) {} 

    get(url: string) { 
    return this.http 
      .get(`${this.appConfig.getAPIUrl()}${url}`) 
      .map(this.extractData) 
      .catch(this.handleErrors); 
    } 

    private extractData(res: Response) { 
    let data = res.json(); 
    return data.body ? data.body.message ? data.body.message : {} : {}; 
    } 

    private handleErrors(error: Response | any) { 
    let errMsg: string; 
    if (error instanceof Response) { 
     const body = error.json() || ''; 
     const err = body.error || JSON.stringify(body); 
     errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
    } else { 
     errMsg = error.message ? error.message : error.toString(); 
    } 
    console.error(errMsg); 
    return Observable.throw(errMsg); 
    } 
} 

class DetailsService extends BaseService { 
    getCheckoutDetails() { 
    let query = '7668'; 
    return this.get(`/buy/getDetails?${query}`) } 
} 
関連する問題