Для меня смешивание реактивных паттернов (субъектов, наблюдаемых) с другими паттернами, в которых состояние хранится в локальных переменных, выглядит как анти-паттерн.
Чтобы предотвратить это, я бы выбрал другой подход:
Я бы начал с темы предмета uploadPicture (было бы здорово, если бы я набрал текст, чтобы избежать 'any'). Идея в том, что за один раз в нее попадает только одна картинка.
uploadPicture = new Subject<any>();
Тогда я бы настроил еще одну наблюдаемую, которая подключается к этой теме uploadPicture:
previewUrls$ = uploadPicture.pipe(
scan((pictures, newPicture) => pictures.concat(newPicture), [])
)
Что хорошо в сканировании, оно генерирует каждый раз, когда значение приходит. Для меня (и недавний твит Бен Леш подтвердил это), это один из самых мощных операторов в RxJS.
Таким образом, каждый раз, когда появляется новое изображение, вы просто следующий на тему uploadPicture:
this.uploadPicture.next(event.target.result)
и весь массив, включая новое изображение, будет генерироваться из previewUrls $.
Отсюда вы можете просто асинхронизировать канал previewUrls$
и получить тот же результат.