Ngrx如何限制HttpEvents流

时间:2018-08-29 06:49:35

标签: angular ngrx ngrx-effects

我正在尝试限制DownloadProgressEpisodes动作的派发数量,而我正在做的事情没有用,我很明白为什么。 但是,我还没有找到正确执行此操作的方法。

this.episodesService.download将返回可观察到的HttPEvent流(类型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。

enter image description here

0 个答案:

没有答案