2017-08-28 49 views
-1

我正在使用角度的http嵌套調用。Angular4 - 嵌套的Http調用

首先調用來獲取令牌。 調用將使用令牌並返回實際數據。

public get(api) { 
    return this.http.get(this.url + '/token') 
     .map(res => res.json()) 
     .toPromise() 
     .then((data: any) => { 
     this.access_token = data.access_token 
     let headers = new Headers(); 
     headers.append('Authorization', 'Bearer ' + this.access_token); 
     return this.http.get(this.url + api, { 
      headers: headers 
     }).map(res => res.json()); 
     }) 
    } 

該函數返回Promise<Observable<any>>。如何解析響應,以便我可以從訂閱中的嵌套調用中獲取數據。

this.get('me/profile') 
    .subscribe(data => { 
     console.log(data); 
     }); 
+1

嘗試刪除'.toPromise()'。這應該返回一個'Observable '。我建議你使用type('Class')來映射數據,以便結果是對象而不是JSON字符串。像Java一樣。 –

+2

要麼與承諾一致(從回調中返回一個承諾)或者觀察者(第二次調用的平面圖)。混合是災難的祕訣。 – jonrsharpe

+0

您正在混合處理異步數據的兩種不同方法,這些方法本身就是非常糟糕的。要麼產生Promise Chaining來獲取數據,請使用.then或者將轉換轉換爲get函數返回的promise。 –

回答

5

您可以使用RxJS運營商如switchMap簡化這一嵌套調用和不使用toPromise()

映射到可觀察的,完整的前面的內部觀察值,發出值。

您正在有效地將第一個observable的發射值傳遞給下一個observable(您的第二個HTTP調用)。這允許您在您的使用示例中訂閱最終結果。

重要的是,在switchMap()return內部可觀察到,在這種情況下,HTTP調用,以有效地發揮作用。

正如其他人所指出的,toPromise()沒有必要的,因爲你可以採取RxJS運營商的優勢來完成這個異步,相關的行動。

public get(api) { 
    return this.http.get(this.url + '/token') 
    .map(res => res.json()) 
    .switchMap(data => { 
     this.access_token = data.access_token; 
     let headers = new Headers(); 
     headers.append('Authorization', 'Bearer ' + this.access_token); 

     return this.http.get(this.url + api, { headers: headers }); 
    }) 
    .map(res => res.json()); 
} 

使用

this.get('me/profile').subscribe(data => console.log(data)); 

注:具有角4+ HttpClient,你並不需要顯式調用json()的響應,因爲它可以自動進行。

希望有幫助!

+0

如果在任何小孩呼叫中出現錯誤,該如何處理錯誤? –

+0

至少你可以嘗試使用catch操作符,但我會檢查以下[討論](https://github.com/Reactive-Extensions/RxJS/issues/829)關於處理內部錯誤的策略。謝謝! –

+0

您提供的鏈接與switchmap和訂閱沒有任何關係。 –