【问题标题】:how to cancel one of the pending http request from many angular 8如何取消来自许多角度 8 的待处理 http 请求之一
【发布时间】:2020-03-28 05:45:58
【问题描述】:

我有一个使用拖放多个文件的文件上传 api 实现。我正在 for 循环中拨打电话,如下所示

uploadFile(file:any[]) {
    file.forEach((file, index)=>{
      const formData = new FormData();
      formData.append('report_file', file);
      this.fileService.uploadFile(this.configurations.uploadUrl, formData)
      .subscribe(fileResp=>{
        console.log('file', fileResp);
      }, error=>{
        console.log('error while uploading files', error);
      });
  });
}

这在上传时有效。但是,如果需要,我需要能够取消其中一个挂起的文件。那么,如果用户选择取消上传,我该如何取消特定的 http 请求?对于批量取消,我可以取消订阅我的 observable,但在这种情况下,我需要让其他人仍在上传。

【问题讨论】:

标签: rxjs observable angular8


【解决方案1】:

这是一个想法:

const files$ = from(files);

files$.pipe(
  mergeMap(
    file => this.fileService.uploadFile(/* ... */).pipe(
      takeUntil(fromEvent(getButtonThatCorrespondsToFile(crtFile), 'click').pipe(take(1)))
    )
  )
)

function getButtonThatCorrespondsToFile (): HTMLButtonElement { }
  • mergeMap - 允许您同时开始对每个文件提出请求
  • takeUntil - 附加到请求的每个文件的 observable 上;确保当点击某个文件对应的按钮时,会取消当前请求

现在我想一个小问题是如何获得与文件对应的按钮,但我认为这不会太难。例如,您可以使用@ViewChildren 来获取所有按钮,并通过使用mergeMap 的投影函数中的索引(第二个参数;mergeMap((val, idx) => ...)),您可以识别某个文件。

【讨论】:

  • 谢谢! @Andrei Gătej 我会试试这个!
  • 有没有办法为 takeUntil 设置 OR 条件?类似于` fromEvent(getButtonThatCorrespondsToFile(crtFile), 'click') || this.ngUnsubscribe`
  • 我觉得有办法,尝试使用defer操作符:defer(() => condition ?a$ : b$)
  • 谢谢,我将 TakeUntil 链接了两次以解决这个问题。
猜你喜欢
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多