typescript-attendre un observable / promesse de finir, et de retour observable
je suis calme nouveau à Typescript & RxJS, et j'essaie de retourner un observable après qu'un autre observable est terminé :
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');
});
}
j'ai l'erreur : "Retourné expression de type d'abonnement n'est pas cessible de type Observable<any>
".
je comprends tout à fait l'erreur ici (un Observable est comme un ruisseau, et un abonnement est le fait d ' "observer" ce ruisseau), mais je ne vois pas comment faire pour "attendre" pour une observable (ou promesse) pour finir de rendre un observable...
2 réponses
le problème est que nous convertissons observable en type différent... .subscribe
- alors que nous ne devrions pas (il ne retourne pas observable)
public makeRequest = (): Observable<any> => {
return this.myObservable().subscribe(
... // this is wrong, we cannot return .subscribe
// because it consumes observable and returns ISusbcriber
);
}
quand on a un observable... nous devrions simplement prendre son résultat et l'utiliser .carte de le convertir en quelque chose d'autre
FlatMap
opérateurtransformer les éléments émis par un Observable en Observables, puis aplanir les émissions de celles-ci en une seule Observables
public makeRequest = (): Observable<any> => {
return this.myObservable()
.flatmap((x) => return this.http
.get('http://jsonplaceholder.typicode.com/posts/1')
.map( (responseData) => {
return responseData.json();
})
...
Vérifier tous les détails ici
PROFITANT DES OBSERVABLES EN ANGLE 2
alors que flatMap () peut fonctionner, puisque vous ne passez pas dans un paramètre qui est utilisé[voir param (x)], le meilleur opérateur à utiliser dans ce scénario est forkJoin ().
s'il vous Plaît voir cet exemple: https://stackoverflow.com/a/38049268/1742393
Observable.forkJoin(
this.http.get('/app/books.json').map((res:Response) => res.json()),
this.http.get('/app/movies.json').map((res:Response) => res.json())
).subscribe(
data => {
this.books = data[0]
this.movies = data[1]
},
err => console.error(err)
);