Rx JS forkjoin прекращает подписку, если есть flatMap внутри одной из наблюдаемых, которую он ждет - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь делать вложенные вызовы, используя rx js с вложенными ответвлениями. Однако я столкнулся с проблемой, когда внешний forkJoin перестает возвращать результат, когда внутренняя наблюдаемая имеет flatMap внутри.

Вот код для иллюстрации.

  // Only returns a value when the flatMap statements are removed from the inner observables it is waiting for
  searchAdmin(searchKey: string): Observable<[StudentAccountSearchResult[], InstructorAccountSearchResult[]]> {
    return forkJoin(
      this.getStudentAccountSearchResults(searchKey),
      this.getInstructorAccountSearchResults(searchKey)
    );
  }

  private getStudentAccountSearchResults(searchKey: string): Observable<StudentAccountSearchResult[]> {
    return this.getStudents(searchKey).pipe(
      map((students: Students) => students.students),
      // Outer forkjoin in searchAdmin returns when I remove the line below
      flatMap((studentsArray: Student[]) => forkJoin(studentsArray.map(student => this.createStudentAccountSearchResult(student)))),
    );
  }

  private getInstructorAccountSearchResults(searchKey: string): Observable<InstructorAccountSearchResult[]> {
    return this.getInstructors(searchKey).pipe(
      map((instructors: Instructors) => instructors.instructors),
      // Outer forkjoin in searchAdmin returns when I remove the line below
      flatMap((instructorsArray: Instructor[]) => forkJoin(instructorsArray.map(instructor => this.createInstructorAccountSearchResult(instructor))))
    )
  }

Оба getStudentAccountSearchResults и getInstructorAccountSearchResults возвращают правильное значение, когда я подписываюсь на них напрямую, поэтому нет ошибок при отображении наблюдаемых. Кто-нибудь знает, почему flatMap в innerObservables заставляет внешний forkJoin перестать возвращать какие-либо результаты? Спасибо!

Я на rx js 6.4

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Ответ такой, как @martin, опубликованный в комментарии к исходному сообщению.

Я исправил его, проверив, пуст ли массив перед выполнением плоской карты

 private getInstructorAccountSearchResults(searchKey: string): Observable<InstructorAccountSearchResult[]> {
    return this.getInstructors(searchKey).pipe(
      map((instructors: Instructors) => instructors.instructors),
      // Outer forkjoin in searchAdmin returns when I remove the line below
      flatMap((instructorsArray: Instructor[]) => instructorsArray.length > 0 
        ? forkJoin(instructorsArray.map(instructor => this.createInstructorAccountSearchResult(instructor)))
        : of([]))
    )
  }
0 голосов
/ 29 марта 2020

Я бы сказал, что внутренние forkJoin s могут быть ненужными, поскольку уже есть внешний forkJoin. На данный момент полученный код может выглядеть примерно так: forkJoin(forkJoin(...), forkJoin(...)). Вместо этого мы могли бы направить все наблюдаемые непосредственно к внешнему forkJoin. Попробуйте следующее

private getStudentAccountSearchResults(searchKey: string): Observable<StudentAccountSearchResult[]> {
  return this.getStudents(searchKey).pipe(
    map((students: Students) => students.students.map(student => this.createStudentAccountSearchResult(student))),
  );
}

private getInstructorAccountSearchResults(searchKey: string): Observable<InstructorAccountSearchResult[]> {
  return this.getInstructors(searchKey).pipe(
    map((instructors: Instructors) => instructors.instructors.map(instructor => this.createInstructorAccountSearchResult(instructor))),
  )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...