Я пытаюсь задушить количество DownloadProgressEpisodes
уведомлений о действиях, и то, что я делаю, не работает, я понимаю, почему.
Однако я не нашел способа сделать это правильно.
this.episodesService.download
вернет наблюдаемый поток событий HttPEvents (от 0 до 3 = загрузка, 4 = успех).
Если я не ограничусь, с большими файлами будут отправлены сотни DownloadProgressEpisodes
действий, и, наконец, когда тип события = 4, DownloadEpisodesSuccess
будет отправлено с ответом (blob).
Когда я дросселирую перед картой взгляды на тип события, происходит изменение, которое будет отброшено последним излучением, что недопустимо. Все события типа 3 можно регулировать, но последний тип события 4 всегда должен обрабатываться.
Это концепция, которую я хочу, но она не работает, потому что of(response)
- это не исходный поток, а только одно излучаемое значение). Перемещение газа вверх вызовет ситуацию, описанную выше.
@Effect( { dispatch: true})
downloadEpisode$ = this.actions$
.pipe(
ofType<any>( episodeActions.DOWNLOAD_EPISODE ),
switchMap( ( { payload } ) => this.episodesService.download( payload )
.pipe(
switchMap( (response: HttpEvent<any> | HttpResponse<any>) => this.episodesService.getHttpProgress( response ) ),
switchMap( ( response: fromServices.DownloadProgress ) => {
if ( response.type <= 3 ) {
return of(response)
.pipe(
throttleTime( 2000 ),
tap( val => console.log( 'type 3-->', val ) ),
map( ( response: fromServices.DownloadProgress ) => {
return new episodeActions.DownloadProgressEpisodes( { ...payload, download: {
progress: response.progress
} } );
} ),
);
} else {
return of(response)
.pipe(
tap( val => console.log( 'type 4-->', val )),
map( ( response: fromServices.DownloadProgress ) => {
return new episodeActions.DownloadEpisodesSuccess( response, { ...payload, download: {
progress: response.progress
} } );
} ),
);
}
} ),
catchError( error => of( new episodeActions.DownloadEpisodesFail( error ) ) ),
)
)
)
Добавление 2 дополнительных эффектов, одного для типа 3 (и газа для этого) и одного для типа 4, также не работает, поскольку исходный эффект будет срабатывать столько раз, сколько излучается событий.
Есть ли оператор, который позволяет мне дросселировать, но всегда включает значение последнего испущенного? Разделение, возможно получение ошибок типа, потому что Эффекту не нравятся 2 возвращаемых потока?
То, что я хочу, показано на рисунке. Я хочу вызывать меньше действий Progress и всегда перехватывать последний ответ, который имеет тип 4 и имеет BLOB-объект.