2017-07-14 64 views
1

如何更改此函數以使用下面描述的JSON更改?Angular 2和RxJS:如何更改返回Observable的HTTP調用

當前函數返回Observable<User[]>,但使用新的JSON時,已添加新的admin對象。新功能應成功觀察現有的users陣列和新的admins陣列。

getData(): Observable<User[]> { 
    return this.http 
    .get('www.example.com/api/users) 
    .map((r: Response) => r.json().assets.users as User[]); 
} 

JSON從/api/users

{ 
"assets": { 
    "users": [ 
     // user objects 
    ] 
} 

返回...現在返回兩個數組,usersadmins

{ 
"assets": { 
    "users": [ 
     // array of user objects 
    ], 
    "admins": [ 
     // array of admin objects 
    ] 

} 

此外,假設我的代碼確實有UserAdmin類已創建正確反映相關JSON對象返回的屬性。

+1

那麼你想要什麼?不清楚 –

+0

感謝您的反饋。我在問題的開頭添加了更多細節。 –

+0

_新函數應該成功觀察_ - 通過觀察你的意思是從兩個數組返回對象?或返回兩個數組? –

回答

1

好了,你有幾種選擇如何返回數據:

getData(): Observable<User[]> { 
    return this.http 
    .get('www.example.com/api/users') 
    .map((r: Response) => { 
     const assets = r.json().assets; 
     return { 
      users: assets.users as User[], 
      admins: assets.admins as Admin[] 
     } 
    }); 
} 

或者這樣:

getData(): Observable<User[]> { 
    return this.http 
    .get('www.example.com/api/users') 
    .map((r: Response) => { 
     return [ 
      assets.users as User[], 
      assets.admins as Admin[] 
     ] 
    }); 
} 

或者這樣:

getData(): Observable<User[]> { 
    return this.http 
    .get('www.example.com/api/users') 
    .map((r: Response) => { 
     return [ 
      ...assets.users as User[], 
      ...assets.admins as Admin[] 
     ] 
    }); 
} 
+0

爲了解釋這裏發生了什麼:'.map()'使用它所連接的數組的值返回一個新數組。因此,爲了返回包含用戶和管理員的新數組,需要在'.map()'中使用一個函數來將響應數據轉換爲新的所需數組。 – snaplemouton

+0

我可以這麼說嗎?你們兩個搖滾!RxJS newb的很好的答案和精彩的解釋。我現在要開始實施這個工作。我希望我的編輯幫助。我試圖按照指導方針和「展示研究努力」,但我可能已經迷失在兔子洞裏了。 –

+0

@Maximus你可以在最終答案中解釋「......資產」中的省略號嗎? –

1

如果你想返回同一個數組中的用戶和管理員,下面的代碼應該可以做到這一點:

getData(): Observable<User[]> { 
    return this.http 
    .get('www.example.com/api/users) 
    .map((r: Response) => { 
     var results = r.json(); 
     return results.assets.users.concat(results.assets.admins); 
    } 
} 

具有下列數據:

{ 
"assets": { 
    "users": [ 
     { "name": "bob" }, { "name": "john" } 
    ], 
    "admins": [ 
     { "name": "jill" }, { "name": "donald" } 
    ] 

} 

其結果將是等於:

[ { "name": "bob" }, { "name": "john" }, { "name": "jill" }, { "name": "donald" } ] 

如我爲@Maximus答案評論解釋的,.map()用於轉化的數組一個新的,這就是爲什麼你想提供一個函數.map()告訴它你正在尋找什麼陣列。