2017-10-03 5 views
0

私はhttpからデータを取得しており、配列内の同じサービス内に格納しています。サービスに格納されている非同期データを取得する方法は?

export class UserService { 
    myusers: User[]; 
    constructor(private http: HttpClient) {} 
    getUsers() { 
    return this.http.get<User[]>('https://randomuser.me/api/results=5') 
    .subscribe(data => { this.myusers = data['results']}); } 
} 

myusersをcomponent.tsでコンソール化すると、「未定義」と表示されます。

export class UserComponent implements OnInit { 
    constructor(private service: UserService) { } 
    ngOnInit() { 
    this.service.getUsers(); 
    console.log(this.service.myusers); //undefined 
    } 
} 

this.service.myusersにはどのようにアクセスできますか?いけないのは、サービスのmyusers配列ではないコンポーネントの配列にデータを格納するソリューションを提案してください。

+0

を使用して配列から観測を返すことができます。オブザーバブルと約束を読んでください。あなたのデータは非同期です。 。呼び出すときにサービスが値を返すとは期待できません。したがって、サービスでObservableを返し、コンポーネント内でそのサービスにサブスクライブする必要があります。 – Robus

+0

したがって、データ(配列)を保守する方法はありませんか?しかし、この配列を他のコンポーネントでhttp.get()を再度呼び出さなくても使うことができるので、これは良いアプローチだと思います。 – Alturistic

答えて

1

APIからデータを返すのに少し時間がかかるため、ジョブの完了に関するサービスからのコールバックが必要です。

export class UserService { 
    myusers: User[]; 
    constructor(private http: HttpClient) {} 
    getUsers() { 
     return this.http.get<User[]>('https://randomuser.me/api/results=5'); 
    } 
    setUsers (users: User[]) { 
     this.myusers = users; 
    } 
} 

コール以下のような機能:

export class UserComponent implements OnInit { 
    constructor(private service: UserService) { } 
    ngOnInit() { 
    this.service.getUsers() 
    .subscribe(data => { this.service.setUsers(data); console.log(data); }); 
    } 
} 

が、これは

+0

これは私の状態をいっぱいにします。リストを作成する* ngFor = "service.myusersのユーザを許可する"。これは良いアプローチですか? – Alturistic

+1

上記のコメントから理解できますように、同じリクエストに対する複数の呼び出しを避けるためのキャッシングアプローチに近づくかもしれません。 APIを呼び出すことでキャッシュレスポンスや新鮮なレスポンスを返す必要があるかどうかは、サービスに詳細を問い合わせてサービスに依頼するのがよい方法です – rex

0

あなたのサービスのようにする必要があり、あなたの目的を果たしていないなら、私に教えてください。

import {Injectable} from '@angular/core'; 
    import {Http, Response} from '@angular/http'; 
    import {Observable} from 'rxjs/Observable'; 

    @Injectable() 

    export class UserService { 
     constructor(private http: Http) {} 

     getUsers(): Observable<void> { 
      const url = 'https://randomuser.me/api/results=5'; 
      return this.http.get(url).map(
       (res: Response) => { 
        return res.json() as = User[]; 
       }).catch(
       (error: Response) => { 
        return Observable.throw(error.json()); 
       }); 
     } 
    } 

コンポーネントは

export class UserComponent implements OnInit { 
    users: User[] = []; 

    constructor(private userService: UserService) { } 

    ngOnInit() { 
    this.getUsers(); 
    } 

    private getUsers(): void { 
     this.userService.getUsers().subscribe(
     (response: User[]) => { 
      this.users = response; 
      console.log(response); 
     ); 
    }  
} 

ノートのようにする必要があります:タイプのスクリプトに基づいてangular4。ベストプラクティスごとにメソッドと変数に型を割り当てる必要があります。

+0

あなたのソリューションはありがたいですが、サービスmyusers配列にデータを保存しません。 – Alturistic

+0

私の答えをチェックしてください。必要に応じて、完成したソリューションを投稿してください – Eliseo

1

あなたは常にrxjsのドキュメントに見てくださいObservable.of

valores=[{id:1,nombre:"uno"},{id:2,nombre:"dos"},{id:3,nombre:"tres"}]; 

getUsers() 
{ 
    if (this.valores) 
     return Observable.of(this.valores); 
    else 
     return this.http.get(url).map((response)=> 
     this.valores=... 
     ...); 
} 
関連する問題