Angular 如何合并使用从创建的可观察阵列的所有贴图

Angular 如何合并使用从创建的可观察阵列的所有贴图,angular,rxjs,Angular,Rxjs,我用FROM操作符创建了一个观察值数组,每个观察值都用margeMap转换。 首先,使用此uploadService.addFile将项目添加到存储库中,然后如果文件未标记为已上载,则我使用uploadService.uploadFile进行上载,此服务将发送上载进度,因此我添加了一个过滤器,以便仅在上载或未上载文件时获取发送 我想做的是只有一个发射指示,所有文件都已上载 我试着使用forkJoin,但对于这个操作符,我没有任何发射,我想是因为在某个时刻,我需要指示操作在最后一个管道内完成,但我

我用FROM操作符创建了一个观察值数组,每个观察值都用margeMap转换。 首先,使用此uploadService.addFile将项目添加到存储库中,然后如果文件未标记为已上载,则我使用uploadService.uploadFile进行上载,此服务将发送上载进度,因此我添加了一个过滤器,以便仅在上载或未上载文件时获取发送

我想做的是只有一个发射指示,所有文件都已上载

我试着使用forkJoin,但对于这个操作符,我没有任何发射,我想是因为在某个时刻,我需要指示操作在最后一个管道内完成,但我不知道如何做到这一点

/*this.therapyFiles这是一个元素数组*/
从(这个治疗文件)管道(
mergeMap(therapyFile=>this.fileParser.parseTherapyEndTime(therapyFile.file.pipe(
地图(日期=>{
therapyFile.endTime=日期;
返回治疗文件;
})
)),
合并地图(治疗文件=>
此文件为.uploadService.addFile(
这个设施,
therapyFile.idDevice,
therapyFile.file.name,
治疗文件。结束时间
).烟斗(
switchMap(文件=>file.isUpload?
关于(本书已出版):
此.uploadService.uploadFile(therapyFile.file)),
地图(进度=>{
therapyFile.uploadProgress=进度;
返回治疗文件;
}),
过滤器(uploadedFile=>uploadedFile.UploadeProgress>99 | | uploadedFile.UploadeProgress<0)
)
)
).subscribe(z=>console.log(z));//在这里,我得到了治疗文件中每个项目的所有发射
/*this.therapyFiles这是一个元素数组*/
分叉连接(来自(此治疗文件)。管道(
mergeMap(therapyFile=>this.fileParser.parseTherapyEndTime(therapyFile.file.pipe(
地图(日期=>{
therapyFile.endTime=日期;
返回治疗文件;
})
)),
合并地图(治疗文件=>
此文件为.uploadService.addFile(
这个设施,
therapyFile.idDevice,
therapyFile.file.name,
治疗文件。结束时间
).烟斗(
switchMap(文件=>file.isUpload?
关于(本书已出版):
此.uploadService.uploadFile(therapyFile.file)),
地图(进度=>{
therapyFile.uploadProgress=进度;
返回治疗文件;
}),
过滤器(uploadedFile=>uploadedFile.UploadeProgress>99 | | uploadedFile.UploadeProgress<0)
)
)
)).subscribe(z=>console.log(z));//我以这种方式尝试过,但从未得到一个emit,但forkjoin的所有内部代码都按预期工作
我希望只有一个emit指示所有文件都已上载

使用concatAll

(本治疗文件)管道的
(
mergeMap(therapyFile=>this.fileParser.parseTherapyEndTime(therapyFile.file.pipe(
地图(日期=>{
therapyFile.endTime=日期;
返回治疗文件;
})
)),
合并地图(治疗文件=>
此文件为.uploadService.addFile(
这个设施,
therapyFile.idDevice,
therapyFile.file.name,
治疗文件。结束时间
).烟斗(
switchMap(文件=>file.isUpload?
关于(本书已出版):
此.uploadService.uploadFile(therapyFile.file)),
地图(进度=>{
therapyFile.uploadProgress=进度;
返回治疗文件;
}),
过滤器(uploadedFile=>uploadedFile.UploadeProgress>99 | | uploadedFile.UploadeProgress<0)
)
),
concatAll()
).subscribe(z=>console.log(z));//我试过了
使用目录

(本治疗文件)管道的
(
mergeMap(therapyFile=>this.fileParser.parseTherapyEndTime(therapyFile.file.pipe(
地图(日期=>{
therapyFile.endTime=日期;
返回治疗文件;
})
)),
合并地图(治疗文件=>
此文件为.uploadService.addFile(
这个设施,
therapyFile.idDevice,
therapyFile.file.name,
治疗文件。结束时间
).烟斗(
switchMap(文件=>file.isUpload?
关于(本书已出版):
此.uploadService.uploadFile(therapyFile.file)),
地图(进度=>{
therapyFile.uploadProgress=进度;
返回治疗文件;
}),
过滤器(uploadedFile=>uploadedFile.UploadeProgress>99 | | uploadedFile.UploadeProgress<0)
)
),
concatAll()
).subscribe(z=>console.log(z));//我试过了

经过研究,我发现 在第一个管道中,fileParser.parseTherapyEndTime使用一个subject来发出结果,但该subject没有使用complete()方法完成,该服务的所有调用都不会完成,所有组合运算符都要求所有内部观察值都完成。 所以我在fileParser.parseTherapyEndTime中添加了complete()方法 我还使用toArray()rxjs操作符将所有发射组合成一个符合所需行为的阵列

我以以下方式更新代码:

来自(this.therapyFiles).pipe(
mergeMap(therapyFile=>this.fileParser.parseTherapyEndTime(therapyFile.file)
.烟斗(
地图(日期=>{
therapyFile.endTime=日期;
返回治疗文件;
})
)),
合并地图(治疗文件=>
此文件为.uploadService.addFile(
这个设施,
therapyFile.idDevice,
therapyFile.file.name,
治疗文件。结束时间
)
.烟斗(
switchMap(文件=>file.isUpload?
关于(本书已出版):
此.uploadService.uploadFile(therapyFile.file)),
地图(进度=>{
therapyFile.uploadProgress=进度;
返回thera