tiene que promesas peticiones observables ningĂșn miembro exportado ejemplo asincronas typescript observable

typescript - promesas - que es subscribe en angular



mecanografiado-esperar que un observable/promesa termine y regresar observable (2)

Soy completamente nuevo en Typescript y RxJS, e intento devolver un observable luego de que se termine otro observable:

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''); }); }

Tengo el error: "La suscripción del tipo de expresión devuelta no es asignable para escribir Observable<any> ".

Entiendo totalmente el error aquí (un Observable es como un flujo, y una suscripción es el hecho de "observar" ese flujo) , pero no veo cómo "esperar" que un observable (o una promesa) termine devolver un observable ...


El problema es que convertimos observables en tipos diferentes ... con .subscribe , mientras que no deberíamos (no se vuelve observable)

public makeRequest = (): Observable<any> => { return this.myObservable().subscribe( ... // this is wrong, we cannot return .subscribe // because it consumes observable and returns ISusbcriber ); }

Cuando tenemos un observable ... deberíamos tomar su resultado y usar .map para convertirlo en algo más

Operador FlatMap

transforma los elementos emitidos por un Observable en Observables, luego aplana las emisiones de esos en un solo Observable

public makeRequest = (): Observable<any> => { return this.myObservable() .flatmap((x) => return this.http .get(''http://jsonplaceholder.typicode.com/posts/1'') .map( (responseData) => { return responseData.json(); }) ...

Revisa todos los detalles aquí

APROVECHANDO LOS OBSERVABLES EN ANGULAR 2


Mientras que flatMap () puede funcionar, ya que no está pasando un parámetro que se usa [vea param (x)], el mejor operador para usar en este escenario es forkJoin ().

Vea este ejemplo: https://.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) );