rxjs уменьшить не продолжить - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующая настройка в приложении 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 не завершает и почему. Это решит мою проблему.

1 Ответ

0 голосов
/ 09 января 2019

Недавно я узнал об операторе toArray , который может упростить ваш код. Ваш поток не завершен, потому что поток до первого switchMap не завершен

/* What is here? Probably still open stream? */
switchMap((action: fromAppAction.LoadInstances) =>
  this.entityService.GetInstances()
),

Быстрая попытка будет поставлена ​​first() или take(1) перед первым switchMap

...