Я думаю, что проблема в том, как userStream$
Наблюдаемые созданы.
Фильтрация пользователей, не закрытых , а затем взятие первых 3 - это то, что можно сделать непосредственно в массиве UserModel [], передаваемом в цепочку каналов с помощью displayEvents$
с помощью filter
и slice
методов. массива.
Если вы сделаете это, вы избавитесь от необходимости использовать функцию from
для создания Observable<UserModel>
, к которому вам затем придется применить flatMap
(который в настоящее время более известен как mergeMap
), чтобы применить окончательно toArray
чтобы преобразовать его обратно в массив UserModel.
Другими словами, вы можете упростить код, как в следующем примере, который в качестве побочного эффекта решает проблему refresh .
this.userStream$ = this.displayEvent$.pipe(
map(users => users
.filter((user: UserModel) => !this.closedUsers.has(user))
.slice(0, this.numberOfUsers))
// flatMap((users: UserModel[]) => from(users))
// // Don't include users we've previously closed.
// , filter((user: UserModel) => !this.closedUsers.has(user))
// , take(this.numberOfUsers)
// , toArray()
, tap(() => console.log('List updated!'))
// Unless we explicitly want to recalculate the list of users, re-use the current result.
, shareReplay(1));
Если честно, я не до конца понял, почему ваше оригинальное решение, которое является своего рода длинным обходом, не работает.