Saltar al contenido

TypeScript: espere a que finalice un observable/promesa y devuelva el observable

Si encuentras alguna incompatibilidad con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

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

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

Cuando tenemos un observable… deberíamos simplemente tomar su resultado y usar .map para convertirlo en otra cosa

FlatMap operador

transformar los elementos emitidos por un Observable en Observables, luego aplanar las emisiones de esos en un solo Observable

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

Consulta todos los detalles aquí

APROVECHANDO LOS OBSERVABLES EN ANGULAR 2

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

Consulte este ejemplo: 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)
);

Calificaciones y comentarios

Te invitamos a asistir nuestro cometido escribiendo un comentario y puntuándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *