Rxjs 如何从多个应用程序中取消一个挂起的http请求8

Rxjs 如何从多个应用程序中取消一个挂起的http请求8,rxjs,observable,angular8,Rxjs,Observable,Angular8,我有一个文件上传api的实现,使用拖放多个文件。我正在for循环中进行调用,如下所示 uploadFile(file:any[]) { file.forEach((file, index)=>{ const formData = new FormData(); formData.append('report_file', file); this.fileService.uploadFile(this.configurations.uploadUr

我有一个文件上传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,但在这种情况下,我需要让其他人仍在上传

这里有一个想法:

const files$=from(文件);
文件$.pipe(
合并地图(
file=>this.fileService.uploadFile(/*…*/).pipe(
takeUntil(从事件(getButtonthattcorrespondstofile(crtFile),'click')。管道(take(1)))
)
)
)
函数getButtonthattcorrespondstofile():htmlButtoneElement{}
  • mergeMap
    -允许您同时开始对每个文件发出请求
  • takeUntil
    -附在每个文件的请求可观察项上;确保当单击与某个文件对应的按钮时,它将取消当前请求

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

也许。现在有点生疏了。用户应该如何取消上传?点击类似的按钮?是的,在进度条旁边会有一个取消图标,用户可以取消。谢谢@Andrei Gătej我会试试这个!有没有一种方法可以让takeUntil有一个好的状态或条件?类似于'fromEvent(getButtonthattcorrespondstofile(crtFile),'click')| | this.ngUnsubscribe`我想有一种方法,试着使用defer操作符:defer(()=>条件?a$:b$)谢谢,我将take链接了两次,直到找到答案。