2016-07-20 9 views
0

私はAngularとRxJSを使ってプロジェクトを書いています。 IはgetRoaster(呼び出したとき)角度の非同期関数の後に戻る

export class AppComponent { 
    public students : Student[]; 
    constructor(private _rosterService : RosterService) { 
     this.students = _rosterService.getRoster(); 
    } 
} 

:しかし、私は(プロバイダとして@Componentに含む)AppComponentのコンストラクタにRosterServiceを注入した後

import {Injectable, Inject} from '@angular/core'; 
import {Http} from '@angular/http'; 
import 'rxjs/add/operator/map'; 

import {Student} from './student.data'; 

@Injectable() 
export class RosterService { 
    private students : Student[]; 
    constructor(@Inject(Http) private http:Http){} 

    private getStudents(){ 
     this.http.get('/JSON/students.json') 
      .map(data => data.json().students) 
      .subscribe(data => this.students = data); 
    } 

    public getRoster() { 
     this.getStudents(); 
     return this.students; 
    } 
} 

:私はこのようなJSONからデータを取得注射クラスを実装しましたgetStudents(async get call)が実行されるまで待機しません。結果で私は未定義の値を得る。

どうすれば対応できますか?レスポンスありがとう。

+0

は私の質問を拡張しました。それは同じではありません。 –

+0

全く同じです。あなたはいくつかのレイヤーを追加しました。 'getRoster'が' getStudents'を同期的に実行するようにします(IOW、 'this.students'を返す前に完了します)。その複製は、それを達成するためにコードを構造化する方法について説明しています。 –

答えて

1

私はコールバック関数を使用します。例えば、約束であれば、私は以下のようなものを使用します。

var data; 
asyncCall().then((result:any) => { 
data = reuslt; 
return data; 
}); 

これがあなたの探しているものかどうかはわかりません。

更新:

 @Injectable() 
    export class RosterService { 
     private students : Student[]; 
     constructor(@Inject(Http) private http:Http){} 

     private getStudents(){ 
      return this.http.get('/JSON/students.json') 
       .map(data => data.json().students) 
       .subscribe(data => this.students = data); 
     } 

     public getRoster() { 
      return this.getStudents().then (() =>{ 
    return this.students; 
      });   
     } 
     } 

そして、あなたのAppComponent内

export class AppComponent { 
    public students : Student[]; 
    constructor(private _rosterService : RosterService) { 
     this._rosterService.getRoster().then ((data:<T>)=>{ 
     this.students =data; 
    }); 
    } 
} 
+0

誤解を招いて申し訳ありませんが、間違って質問を表明しました。調整しました。 –

+0

then $ httpを使用し、データを返します。 – Aj1

+0

私は分かりませんが、Javascriptでは正しいですが、Typescriptでは非同期呼び出しの中で値を返すことはできません –

0

Javascriptのキーパターンが根本的に欠落しているようですが、これはコールバックです。

関数から値を返す代わりに、関数が正常に機能しているときに実行するコードを渡します。

function doSomething(success) { 
    var data = 1; 
    // blah blah blah, something happens. 
    success(data); 
} 

function myFunction(data) { 
    console.log(data); 
} 

doSomething(myFunction); 

こうして、呼び出しの非同期性を保つことができます。これは、Javascriptで使用できる単一スレッドをブロックしません。

+0

誤解を招いて申し訳ありませんが、間違って質問を表明しました。今すぐ調整しました。 –

0

あなたの非同期関数が約束を返すと仮定しています。


まず、ロジックが一種の奇妙な..ですdatafuncdataにアクセスすることができない、機能にスコープされます。

function() { 
    return func().then(data => data) 
} 

それはこれと同じことになり除き、次のとおり:

function() { 
    return func() 
} 

..andその場合にはあなたにもちょうどそれを置き換える可能性がある。ここ

はあなたおそらくが何をしたいですfuncで機能します。

func 

は(またはfunc場合、いくつかの他のオブジェクト、() => func()のプロパティです。)

EDIT:それは約束を返します当然のように、この新しい関数は非同期関数です。あとで.thenを使用してデータを取得する必要があります。

+0

誤解を招いて申し訳ありませんが、間違って質問を表明しました。今すぐ調整しました。あなたのコメントとスコープをありがとう - 私はそれを落とした。 –

関連する問題