this.http.get('../assets/my_json_file.json')
is async, which means that a call to the server is scheduled for later execution and when the response from the server arrives eventually the callback passed to .subscribe(...)
will be called with the response. "scheduled" means a task will be added to the event queue for later execution when the previously scheduled tasks are done.
After the http.get(...)
call is scheduled console.log(this._data)
will be executed. This is before the call to the server is even initiated.
The http.get(...)
call is also only scheduled when the observable returned by http.get(...)
is subscribed to because observables are lazy.
Using map(...)
instead of subscribe(...)
returns an Observable
instead of a Subscription
which allows the user of your service to chain it's own code to response events.
@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)
}
}
In a component you can use it like
export class MyComponent {
constructor(service:Service) {
// `subscribe` actually initiates the call to the server
service.getData().subscribe(result => console.log(result));
}
}
See also What is the correct way to share the result of an Angular 2 Http network call in RxJs 5?
This way you can already initiate the call to the server when the service is instantiated, not only after the component that uses the service subscribes.