を行ったかを把握助けにはなりませんでしたthis.http.get('../assets/my_json_file.json')
は非同期です。つまり、サーバーへの呼び出しが後で実行できるようにスケジュールされ、サーバーからの応答が最終的に到着すると、.subscribe(...)
に渡されたコールバックが応答と共に呼び出されます。 「スケジュールされた」とは、以前にスケジュールされたタスクが完了したときに後で実行するために、タスクがイベントキューに追加されることを意味します。
http.get(...)
のコールの後にconsole.log(this._data)
が実行されます。これは、サーバーへの呼び出しが開始される前です。
http.get(...)
によって返されたオブザーバブルがサブスクライブされている場合にのみ、オブザーバブルが遅延しているため、http.get(...)
コールもスケジュールされます。
map(...)
代わりsubscribe(...)
の返品代わりに応答イベントにチェーンそれ自身のコードにあなたのサービスをユーザーに許可するSubscription
のObservable
を使用します。あなたは
export class MyComponent {
constructor(service:Service) {
// `subscribe` actually initiates the call to the server
service.getData().subscribe(result => console.log(result));
}
}
も参照してくださいWhat is the correct way to share the result of an Angular 2 Http network call in RxJs 5?
のようなサービスがないだけ後に、インスタンス化されたときに、あなたが既にサーバーへのコールを開始することができます。この方法でそれを使用することができるコンポーネントで
@Injectable()
export class Service {
_data: any
constructor(private http: Http) {}
getData() {
this.http
.get('../assets/my_json_file.json')
.map(x => x.json())
.map((data) =>
this._data = data
)
console.log(this._data)
}
}
サービスを使用するコンポーネントはサブスクライブします。
このように使用することはできません。 * http *は非同期で、同期を使用する必要があります。 サービスで* getStuff *関数を使用できますが、データが準備できたらこれらの関数を呼び出す必要があります。これはappコンポーネント内に別のサブスクライバを置くことによってのみ可能です。 それは* json *であることに関係なく、データはサーバからのものと同じ* http *で取り出されます。 – tibbus