【问题标题】:How to cancel specific request from all pending request如何从所有待处理的请求中取消特定请求
【发布时间】:2020-11-05 06:30:10
【问题描述】:

在我的 Ionic 网络应用中,

对于浏览器

我想实现一个取消下载功能,目前用户可以同时下载多个文件,所以我想取消特定的下载 HTTP 请求。

这是我目前拥有的。

@Effect()
public fileDownloadAction$: Observable<Action> = this.action$
    .ofType(FileDownloadActionTypes.FILE_DOWNLOAD_REQUESTED)
    .map(this.toPayload)
    .mergeMap(payload => (this.downloadService.downloadFile(payload))
        .concatMap((res: any) => {                       
            return Observable.from([
                new FileDownloadCompleted(downloadSuccess)
            ]);
        })
    )

但我不知道如何在效果中执行此操作。有什么建议? 在此先感谢:-)

【问题讨论】:

  • 你有没有考虑过类似downloadService.downloadFile(payload).pipe(takeUntil(stopDownload(payload))) 的东西,stopDownload 会生成一个 observable,当文件停止下载时会发出。
  • 是的,我试过了,但它会停止所有文件下载请求。

标签: ionic3 angular5 ngrx ngrx-store ngrx-effects


【解决方案1】:

不确定具体问题是什么,但您可以使用exhaustMapswitchMap(而不是mergeMap)来取消新的或待处理的请求。

【讨论】:

  • 感谢您的建议 :) 我尝试了exhaustMap,但它一次允许 1 个下载请求,switchMap 取消所有正在进行的下载请求,一次只允许 1 个下载请求,以便允许我使用mergeMap 的多个文件下载请求。我的问题是我想取消特定的文件下载请求而不是全部
  • 我目前没有太多时间,但我认为您必须在有效负载上使用 groupBy,然后使用 Andrei 在分组请求中提到的 takeUntil。请参阅youtube.com/watch?v=hsr4ArAsOL4(mike 和 sam 关于 groupby 运算符的谈话)
【解决方案2】:

在花了很多时间研究 RxJS 之后,我在没有改变效果的情况下做到了。这是混乱的魔法。

public download (endpoint: string, body: any = {}, uniqueKey: string) {

let req = new HttpRequest('POST', endpoint, body, { 
  responseType: 'blob',
  reportProgress: true, 
  headers: new HttpHeaders({
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  })
});

return new Observable(observable => {
  let downloadRequest = this.http.request(req).subscribe(results => {
      observable.next(results);
      if(results['type'] == 4) {
       //Complete Observable once download success
        observable.complete();
      }
  });
  allDownloadReq[uniqueKey] = downloadRequest;
});
}

我已经将每个下载订阅者推送到一个数组中,并用 uniqeKey

取消了它
public cancelDownload (key) {
  if(allDownloadReq[key]) {
    allDownloadReq[key].unsubscribe()
    return true;
  } else {
    return true
  }
}

仍然欢迎提出建议

希望这会对某人有所帮助。

【讨论】:

猜你喜欢
  • 2018-07-12
  • 2014-10-07
  • 1970-01-01
  • 2019-10-27
  • 2021-01-05
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多