Я пытался использовать метод merge () вместо функцииlateLatest (), чтобы все полученные данные мгновенно отправляли его родительскому объекту Observable, но, очевидно, я просто не могу этого сделать
Похоже, вы ищете частичные данные, как только они будут готовы.И combLatest () , и forkJoin () будут выдавать данные только тогда, когда они могут заполнять массив равной длины с количеством наблюдаемых.Таким образом, вы либо ждете хотя бы одно значение в каждой наблюдаемой, либо ждете их завершения, но они излучают массив, и им нужно знать, что в него вставить.
Я думаю, что вы хотите испустить каждый кусокданных, как только они будут готовы.
Начните с использования merge () для выдачи значений из всех 3 наблюдаемых, но для каждой наблюдаемой используйте map () для созданияпара ключ / значение объекта для данного типа (изображения, стили, категории).
Наконец, используйте оператор scan () , чтобы объединить значения в один объект, который будет излучать каждыйсвойство как оно обновлено.
Потребители потока могут проверить, является ли свойство null
, чтобы увидеть, готово оно или нет.Поток передаст 3 значения до его завершения.
getAll(): Observable<{home: Home, images: any[], styling: any[], categories: any[]}> {
return this.getHome().pipe(
tap((home: Home) => this.application = home),
switchMap((home: Home) =>
merge([
this.getAssets(home.images).pipe(
defaultIfEmpty([]),
map(images => ({images}))
),
this.getStyling(home.styling).pipe(
defaultIfEmpty({}),
map(styling => ({styling}))
),
this.getCategories(home.categories).pipe(
defaultIfEmpty([]),
map(categories => ({categories})
),
]),
scan((acc, next) => ({...acc, ...next}), {home, images: null, styling: null, categories: null})
)
);
}
Вы можете добавить оператор startWith({})
к оператору merge()
, если хотите создать первое значение, где все свойства равны null
.Как раннее значение для потребителей, чтобы они знали, что чтение для других значений началось.