In my page there is a button that generates a report. That report needs data that is loaded using a http call to a rest endpoint when the page is loaded, but I do not have a guarantee that they are loaded when the user presses the report button.
How can I watch the observable to see if it is completed, and if incomplete, to wait on the action until the http call is completed? Here is some of the code:
loadCompanies(): void {
this._companyService.getCompanies().subscribe(
response => {
this.companiesModel = response;
},
err => console.log(err)
);
}
generateReport() {
// check if observable that loads companies is completed and do the
// action using companiesModel.
}
One option is a flag set in loading companies with values of 'loading' and 'completed', and make a wait in generateReport()
until the flag is completed,
but I would prefer a solution using the Observable
API if possible.
In this kind of scenarios it is very useful to use concatMap operator to guarantee to execute the next operation only when the previous has done.
Method
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/finally.md
You can do this by using
onCompleted
callback insubscription
. For example, let's say you show loading bar when user press report button;If you get error from your http call,
onCompleted
method will not be invoked, onlyonError
will be invoked. If it is successful,onCompleted
method will be called after youronNext
method.Here is the documentation for subscribe. I hope it helps!
The solution I came up with is to use a shared observable, save the request as a hot observable that way when the report button is clicked it will wait for the request or immediately generate if the request is complete.
https://stackblitz.com/edit/check-if-an-observable-is-completed?file=src%2Fapp%2Fapp.component.ts
Update: You could take it one step further and make the UI async https://stackblitz.com/edit/check-if-an-observable-is-completed-async-ui?file=src%2Fapp%2Fapp.component.html
One more solution:
Actually subscribe function takes three parameters:
onNext onError onCompleted