I am quite new to TypeScript & RxJS, and I am trying to return an Observable
after another Observable
is finished:
public myObservable = () : Observable<boolean> => {
console.log('retrieving the token in DB');
return Observable.create(observer => {
setTimeout(() => {
observer.next(true);
observer.complete();
}, 5000);
});
}
public makeRequest = (): Observable<any> => {
return this.myObservable().subscribe(
function (x) {
console.log('I have the token, now I can make the HTTP call');
return this.http.get('http://jsonplaceholder.typicode.com/posts/1')
.map( (responseData) => {
return responseData.json();
})
.map((item:any) => {
return {
id: item.id,
userId: item.userId,
title: item.title,
body: item.body
};
});
},
function (err) {
console.error('Error: ' + err);
},
function () {
console.log('Completed');
});
}
I received this error: "Returned expression type subscription is not assignable to type Observable<any>
".
I totally understand the error here (an Observable is like a stream, and a subscription is the fact of "observing" that stream), but I don't see how to "wait" for an Observable
(or a promise) to finish to return a new Observable
. How can I do that?
I am looking for this answer some days because this is my problem too. Today I have the answer and would like to share.
The code is:
and the function completed will be executed after the subscribe is complete.
Hope this helps.
While flatMap() may work, since you are not passing in a parameter that is used[see param (x)], the best operator for you to use in this scenario is forkJoin().
Please see this example: https://stackoverflow.com/a/38049268/1742393
The problem is that we convert observable into different type... with
.subscribe
- while we should not (it does not return observable)When we have an observable... we should just take its result and use .map to convert it to something else
Check all the details here
TAKING ADVANTAGE OF OBSERVABLES IN ANGULAR 2