2017-04-19 44 views
1

時,我有以下登錄功能:角2個可觀察休息加入回調邏輯

login(payload: Object) { 
    return this.http.post(this.apiUrl, payload) 
     .map(res => res.json()) 
     .catch((error: any) => Observable.throw(error.json().error || 'Server error')); 
    } 

我這樣稱呼它在登錄時,它工作正常:

this.sk_auth.login(this.loginCreds).subscribe((response)=>{ 
     console.log(response); 
     //here we can do anything we want with the response. 
    if(response.success){ 
     sessionStorage.setItem('token', response.token); 
     sessionStorage.setItem('user', JSON.stringify(response.user)); 

    }); 

的問題是,我需要在我回復回復之前做一些事情。我嘗試這樣做:

login(payload: Object) { 
    return this.http.post(this.apiUrl, payload) 
     .map(res => res.json()) 
     .map((res)=>{ 
     //do some stuff... 
     }) 
     .catch((error: any) => Observable.throw(error.json().error || 'Server error')); 
    } 

當我添加了觀察響應不再被返回到登錄組件上的訂閱第二張地圖。提前致謝。

+1

你確定你在第二張地圖中有return語句嗎?由於您使用的是大括號符號,因此不會像以前更簡單的那樣自動返回該函數。 – FraserES

回答

0

您需要使用運算符'do'您可以在我的文章中閱讀熟悉$ q的angularJS開發人員的基本rxjs運算符。 $Q map to RxJS

0

如果你想做超過1件事情,你可以使用承諾。

login(payload: Object) { 
    return this.http.post(this.apiUrl, payload) 
     .toPromise() 
     .then(this.extractData) 
     .then(this.doSomeStuff) 
     .catch(this.handleError); 
} 
private extractData(res: Response) { 
    let body = res.json(); 
    return body || []; 
} 
private doSomeStuff(body: any) { 
    //do some stuff... 
    return theStuff; 
} 
private handleError(error: any) { 
    Observable.throw(error.json().error || 'Server error'); 
} 
1

已解決。我沒有返回第二個映射函數的結果。 (拍我的前額!)

login(payload: Object) { 
    return this.http.post(this.apiUrl, payload) 
     .map(res => res.json()) 
     .map((res)=>{ 
     //do some stuff... 
     return res; 
     }) 
     .catch((error: any) => Observable.throw(error.json().error || 'Server error')); 
    }