Прежде всего, я не уверен, чего вы на самом деле пытаетесь достичь, так как я не понимаю, что вы подразумеваете под
Я хочу иметь возможность определять функцию обратного вызова подписки для каждогозвонков, так как мне нужна ссылка на процесс
В любом случае, в ситуации, подобной той, которую вы описываете, я бы сделал что-то вроде этого
public getOrganizationForUser(): Observable<Organization> {
return this.httpClient
.get<Organization>(`${c.serviceBaseUrl.sp}/organizationByUser`)
.pipe(catchError((err, source) => this.responseHandler.onCatch(err, source)));
}
public getById(id: number) {
return this.httpClient
.get<Convention>(`${c.serviceBaseUrl.sp}/conventions/` + id)
.pipe(catchError((err, source) => this.responseHandler.onCatch(err, source)));
}
ngOnInit() {
const obsOfObservables = this.OrganizationService.getOrganizationForUser()
.pipe(
map(organization => organization.contracts),
map(contracts => contracts.map(contract => this.conventionService.getById(contract.conventionId)))
);
obsOfObservables
.pipe(
switchMap(conventionObservables => forkJoin(conventionObservables))
)
.subscribe(
conventions => { // do stuff with conventions }
)
}
Ключевые моменты здесьследующие:
Через getOrganizationForUser()
вы получаете Наблюдаемое, которое испускает Организацию.Первое, что вы делаете, вы превращаете объект, испускаемый наблюдаемой, в Массив контрактов с первым оператором map
.
Второй оператор map
преобразует Массив контрактов в Массив наблюдаемых соглашений,Для выполнения этого преобразования мы используем метод Array map
в операторе map
объекта Observable.Это может немного сбивать с толку, но это стоит понять.
Если мы остановимся здесь, то у нас будет obsOfObservables
, то есть Наблюдаемая, которая испускает Массив Наблюдаемых.
Мы тогдапередать массив наблюдаемых, выданных obsOfObservables
, в функцию forkJoin
, которая сама по себе возвращает наблюдаемую.Так как мы на самом деле заинтересованы в том, что уведомляет Observable, возвращаемое forkJoin
, то есть нас интересуют соглашения, то нам нужно переключить с первой Observable на вторую, и это делается с помощьюswitchMap
operator.
Чистый результат - Observable, который возвращает массив соглашений.Учтите, что константа obsOfObservables
была добавлена как попытка прояснить причину, и она совершенно не нужна (как сказал бы Барни Панофски).
Я не симулировал все это,так что я надеюсь, что я не вставил ошибки, но более или менее это мыслительный процесс, который я бы использовал в этом случае.
Последнее примечание, обычно будьте подозрительны, если у вас есть subscribe
в пределах subscibe
.