Как объединить две наблюдаемые, чтобы создать новую наблюдаемую? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть две службы: «PatientsService» и «AppointmentService». В третьем сервисе «AppointedPatientsService» я хочу подписаться на AppointmentService, чтобы получать все забронированные встречи с PatientId, и после этого я хочу многократно подписываться на PatientsService.getPatient (PatientId), чтобы получать данные пациента с PatientId. И затем я хочу вернуть новый массив с именем allAppointedPatients, который содержит все встречи с данными пациента. Я попробовал это ...

 getAppointments() {
let allAppointments: Appointment[] = [];
const allAppointedPatients: AppointedPatient[] = [];

return this.appointmentService.fetchAllAppointments().pipe(
  take(1),
  tap(appointments => {
  allAppointments = appointments;

  for (const appointment of allAppointments) {
    this.patientsService.getPatient(appointment.patientId).pipe(
      tap(patient => {
        const newAppointment = new AppointedPatient(patient.firstName,
                                                  patient.lastName,
                                                  patient.address,
                                                  patient.casePaperNumber,

 appointment.appointmentDateTime);
        allAppointedPatients.push(newAppointment);
      })
    ).subscribe();
  }
  return allAppointedPatients;
}),
pipe(tap((data) => {
  return this.allAppointedPatients;
}))
);

}

Это не работает, и я знаю, что должен быть лучший способ справиться с таким сценарием. Пожалуйста, помогите ...

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Вы путаете асиновый код c (наблюдаемые) с кодом syn c, пытаясь вернуть массив allAppointedPatients синхронно.

Сначала поймите, как работает асин c код в Javascript, а также почему полезны Observables (потоки).

Попробуйте приведенный ниже код и убедитесь, что вы понимаете. Конечно, я не смог протестировать его, поэтому при необходимости внесите свои изменения.

getAppointments(): Observable<AppointedPatient[]> {
    return this.appointmentService.fetchAllAppointments()
        .pipe(
            switchMap(appointments => {

                const pacientAppointments = [];

                for (const appointment of allAppointments) {

                    // Extract the data aggregation outside or create custom operator
                    const pacientApp$ = this.patientsService.getPatient(appointment.patientId)
                        .pipe(
                            switchMap((pacient) => of(
                                new AppointedPatient(
                                    patient.firstName,
                                    patient.lastName,
                                    patient.address,
                                    patient.casePaperNumber,
                                    appointment.appointmentDateTime
                                )
                            ))
                        )

                    pacientAppoinments.push(pacientApp$);
                }

                return forkJoin(pacientAppointments);
        });
}
1 голос
/ 04 марта 2020

Вы можете использовать forkJoin:

forkJoin(
            getSingleValueObservable(),
            getDelayedValueObservable()
            // getMultiValueObservable(), forkJoin on works for observables that complete
          ).pipe(
            map(([first, second]) => {
              // forkJoin returns an array of values, here we map those values to an object
              return { first, second };
            })
          );
...