2016-04-11 4 views
1

Ich habe einen http-Aufruf an einen Remote-Server mit der angular2/http und das funktioniert alles super und so. Aber ich habe Probleme mit den Observablen, die es zurückgibt.Aufruf von Funktionen vor dem Abonnieren

Wenn ich meine http-Aufrufe mache, gehe ich durch 3 verschiedene Komponenten.

(für einfache hier krank nur die Anrufe 3 verschiedene Methoden stattdessen machen, wie es das gleiche funktioniert)

Was ich wissen will, ob seine mögliche zu tun, ist die Verwendung zweimal auf dem gleichen beobachtbaren abonnieren oder wenn es ist ein Weg, wie ich einige Funktionen aufrufen kann, so dass ich die Anmeldung in die Anfrage hinzufügen kann, anstatt sie an jedem Ort hinzufügen zu müssen, an dem ich einen http-Anruf tätige.

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); 
    },() => { 

    }); 
    } 

Im request Methode Ich möchte ein console.log können, rufen Sie die URL zu drucken, die verwendet wurde und die Daten vom Server oder Fehler empfangen zu drucken. Ich weiß, ich könnte es zu den Erfolg und Fehler Teile des Abonnierens in ngOnInit()emailExists() Anruf hinzufügen, aber das würde bedeuten, dass ich diese in jedem einzelnen Anruf in der App setzen müsste.

Vielen Dank im Voraus für Ihre Hilfe und Zeit.

Antwort

1

Sie könnten die do, catch und finally Operatoren von Observablen dazu nutzen, das zu tun. Hier

ist ein Beispiel:

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); 
    }); 
Verwandte Themen