У меня есть следующая настройка в приложении 7 angular:
@Effect({dispatch:false})
LoadInstances$ = this.actions$.pipe(
ofType(fromAppAction.AppActionTypes.LoadInstances),
take(1), // <-- solved my problem
switchMap((action: fromAppAction.LoadInstances) =>
this.entityService.GetInstances()
),
switchMap(instances=>from(instances)), // flatten the array to single values
flatMap( // combine the instance with its UserData
(inst)=>this.entityService.GetCurrentUserInfo().pipe(take(1)),
(inst,usr)=>({...inst, UserData:usr})
),
flatMap(
(inst)=>this.entityService.GetUserPersonalSettings(inst.id).pipe(take(1)),
(inst,settings)=>({...inst, Settings:settings})
),
tap(result=>console.log('before reduce:',result)), // <-- this gets called 3 times (I have 3 instances)
reduce<Instance>((a, c) => [...a, c], []), // accumulate all results to one array
tap(result=>console.log('instances: ', result)), // <-- this gets never called
...
по сути, у меня есть массив экземпляров, сглаживаю их, вызываю GetCurrentUserInfo и GetUserPersonalSettings для каждого экземпляра, добавляю результат как свойство к экземпляру и затем хочу накапливать их обратно в экземпляр [].
Пока это работает, только функция уменьшения не продолжается. Я знаю, что это потому, что одна из других наблюдаемых не завершена. но как это может быть?
Начальное значение from (instance) перебирает массив и должно завершиться, да? А вызовы GetPersonalSettings - это просто вызовы httpClient.get (), которые согласно документации являются наблюдаемыми с одним значением и заканчиваются после успешного вызова.
Кто-нибудь может мне помочь?
[Изменить]
сканирование здесь не вариант, так как для продолжения мне нужен полный массив экземпляров.
[Edit2] toArray имеет ту же проблему, что и Reduce, он выдает результат, только если предыдущий Observable (s?) Завершен.
В любом случае : Я не хочу менять эту настройку, поскольку она работает в основном. Я только хочу понять, что Observable не завершает и почему. Это решит мою проблему.