Cómo suscribir la matriz de Observable Forkjoin no funciona

Nov 18 2020

Estoy tratando de hacer múltiples solicitudes HTTP en angular usando forkjoin. Pero cuando me suscribo a Observable, no da ninguna respuesta.

 let data = this.email.map((email) =>
          this.get_student_service.get_student_by_email_id(email)
        );

        forkJoin([data]).subscribe((res) => {
          console.log(res);
        });

        console.log('Execute');

Aqui esta mi servicio

  get_student_by_email_id(email) {
    return this.fire_store
      .collection('User', (ref) => ref.where('email', '==', email))
      .valueChanges();
  }

Respuestas

1 JBoothUA Nov 19 2020 at 06:21

Ok, si no puede suscribirse sin la función de mapa que ayuda, creo que lo que está sucediendo es que su función get_student_xxx no devuelve un observable.

Si esa función devuelve un observable, podrá suscribirse a ella.

puede hacer esto para obtener ayuda adicional del transpilador:

get_student_by_email_id(email) : Observable<someobject> {
...
}

Entonces, eso le da un par de opciones ... ¿Quizás solo necesita cambiar el valor de retorno y no usar Observable y suscribirse?

O tal vez necesite devolver un objeto diferente que sea observable.

También hay formas de crear su propio observable, por ejemplo, rxjs tiene una función llamada "de" que puede usar para "envolver" un objeto en un observable:

// RxJS v6+
import { of } from 'rxjs';
//emits any number of provided values in sequence
const source = of(1, 2, 3, 4, 5);
//output: 1,2,3,4,5
const subscribe = source.subscribe(val => console.log(val));

Además, si su función devuelve una matriz de observables, ¿es posible que [datos] sean solo datos

MohdSabban Nov 26 2020 at 05:25

A partir de ahora, no obtuve ninguna respuesta, así que reinicialicé la base de fuego vainilla en component.ts y probé que me funcione. Si alguien resuelve este problema usando fuego angular, hágamelo saber. aquí está mi solución

const firebaseapp = firebase.initializeApp(environment.firebase);

get_student_email() {
    let store = firebaseapp.firestore();
    this.get_project_service
      .get_project_by_doc_id(this.batchID, this.projectID)
      .subscribe(async (res) => {
        this.response = res;
        this.email = [
          '[email protected]',
          '[email protected]',
          '[email protected]',
        ];
        const information = await Promise.all(
          this.email.map(async (i) => {
            let a = await store
              .collection('User')
              .where('email', '==', i)
              .get();
            let collection;
            a.forEach((element) => {
              collection = element.data();
            });
            return collection;
          })
        );
        //  request end
        console.log(information);
      });
    // subscriber End
  }