2016-04-11 2 views
1

angular2/httpを使用してリモートサーバーにhttp呼び出しを行いました。すごくうまく動作しています。しかし、私はそれが返すobservablesを使用することに問題があります。サブスクライブする前に関数を呼び出す

httpコールを発信すると、3つの異なるコンポーネントを経由します。

私はその可能性が何をしているかどうかを知りたい何

を(それは同じうまくいくよう容易にするために、ここで病気のわずか3種類の方法の代わりに呼び出しを行う)、使用が同じ観察可能な上、または場合は二回サブスクライブですが私はHTTPコールを行うすべての場所に追加する必要はなく、リクエストにロギングを追加できるように、いくつかの関数を呼び出すことができます。私が使用されたURLをプリントアウトし、サーバーまたは任意のエラーから受信したデータを印刷するにconsole.logを呼び出すことができるようにしたいrequest方法で

request(type: RequestMethod, url: string, data: any) { 

    let params: URLSearchParams = new URLSearchParams(); 
    let req: RequestOptions; 
    let headers = new Headers(); 

    for (let key in data) { 
     params.set(key, data[key]); 
    } 

    if (type === 0) { 
     req = new RequestOptions({ 
     method: type, 
     search: params 
     }); 
    } else { 
     headers.append('Content-Type', 'application/x-www-form-urlencoded'); 
     req = new RequestOptions({ 
     method: type, 
     body: params.toString(), 
     headers: headers 
     }); 
    } 

    console.log('Http Request: ' + url); 
    console.log(req); 
    return this.http.request(this.testUrl + url, req) 
     .map((res: Response) => res.json()); 
     // .subscribe(         
     // data => {         
     //  console.log('Data Return for ' + url); 
     //  console.log(data.data); 
     //  // return data; //i removed this subscribe so i can 
     // },    //pass the map back through and 
     // err => {   //use the subscribe later in the initial call 
     //  this.logError(url, err); 
     // }, 
     // () => { 
     //  if (afterSuccess) { 
     //  afterSuccess(); 
     //  } 
     //  console.log('Completed '+ url); 
     // } 
     //); 
    } 

    logError(url: string, err: any) { 
    console.log('Error in call: ' + url); 
    console.log(err); 
    } 

    get(url: string, data: any) { 
    return this.request(RequestMethod.Get, url, data); 
    } 

    post(url: string, data: any) { 
    return this.request(RequestMethod.Post, url, data); 
    } 

    emailExists(email_address: string, user_type?: string) { 
    let data: any = {}; 

    data.email_address = email_address; 
    data.service_provider_id = this.service_provider_id; 

    if (user_type) { 
     data.user_type = user_type; 
    } 

    return this.get('emails/email-address/exists', data); 
    } 

    ngOnInit() { 
    this.emailExists('[email protected]').subscribe(data => { 
     this.email = data.data; 
     console.log('in Signin'); 
     console.log(this.email); 
    }, err => { 
     console.log(err); 
    },() => { 

    }); 
    } 

。 で購読の成功とエラーの部分に追加することができます。ngOnInit()に電話することができますが、これはアプリ全体を通してすべての呼び出しを行う必要があることを意味します。

ご協力いただきありがとうございます。

答えて

1

これを行うには、docatchfinally観測者の演算子を利用できます。ここで

はサンプルです:

return this.http.request(this.tpayUrl + url, req) 
    .map((res: Response) => res.json()) 
    .do(data => {         
     console.log('Data Return for ' + url); 
     console.log(data.data); 
    }) 
    .catch(err => { 
     this.logError(url, err); 
     return Observable.throw(err); 
    }) 
    .finally(() => { 
     if (afterSuccess) { 
     afterSuccess(); 
     } 
     console.log('Completed '+ url); 
    }); 
関連する問題