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...

18
demandé sur Radim Köhler 2016-05-18 18:34:14

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érateur

transformer 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

11
répondu Radim Köhler 2016-05-18 15:54:17

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)
);
10
répondu rbj325 2017-05-23 22:41:53