2017-07-14 3 views
1

この関数を、以下に説明するJSONの変更で動作するように変更するにはどうすればよいですか?角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は現在2つの配列usersadminsを返す... /api/users

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

から返されました。

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

} 

私のコードが正しく返さ関連JSONオブジェクトのプロパティを反映し、既に作成したUserAdminのクラスを持っていることを前提としてください。

+1

あなたは何をしたいですか?明確ではありません –

+0

フィードバックありがとうございます。私は質問の冒頭に詳細を追加しました。 –

+0

_new関数は正常に観測する必要があります - 観測することによって両方の配列からオブジェクトを返すことを意味しますか?または2つの配列を返しますか? –

答えて

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

私はこれをちょうど言うことができますか?あなたは2つの岩!RxJS newbの素晴らしい答えと素敵な説明。私は今これを実装するつもりです。私の編集が助けられたことを願っています私はガイドラインに従い、 "研究努力を示す"ように努力しましたが、ウサギの穴を少し失ってしまったかもしれません。 –

+0

@Maximusあなたは最終回答の "... assets"の省略記号について説明できますか? –

1

あなたがしたい場合は同じ配列のユーザーと管理者の両方を返すと、次のコードでそのトリックが行われます。

結果は等しくなる

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

} 

に:次のデータで

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

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

としては@Maximusの答えのための私のコメントで説明し、.map()はに配列を変換するために使用されますあなたが探している配列を教えてくれる機能を.map()に与える必要があるのは、新しいものです。

関連する問題