修改数组对象的可观察内容

时间:2019-03-13 12:11:00

标签: angular rxjs

我的服务具有以下功能:

val myCompiler: Task ~> Id = ???
val tryCompiler: Task ~> Try = ???

pipeline.foldMap(myCompiler)  // Id[Unit]
pipeline.foldMap(tryCompiler) // Try[Unit]

如您所见,getFiles返回文件数组的Observable,而getFileUri接受文件名(File类的属性)并返回Observable。

我想做的是,将这两个功能结合起来。这意味着,getFiles()仍应返回 getFiles(): Observable<File[]> { const makeFiles = map((response: FileResponse[]): File[] => { return response.map((fileResponse: FileResponse): File => { return File.fromResponse(fileResponse); }); }); return this.httpService.get('/profile/files').pipe( makeFiles, shareReplay(), ); } getFileUri(filename: string): Observable<SafeUrl> { return this.httpService.get(`/profile/file/uri/${filename}`).pipe( mergeMap((uri: string) => this.httpService.get(uri, {}, { useUrlAsItIs: true, responseType: 'arraybuffer' })), map((fileBuffer: any) => { const unsafeUrl = URL.createObjectURL(new Blob([fileBuffer], {type: 'application/binary'})); const safeUrl = this.sanitizer.bypassSecurityTrustUrl(unsafeUrl); return safeUrl; }) ); } ,并且数组中的每个File都应具有safeUrl属性。

我的问题是,我真的不知道如何完成这项复杂的任务。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您不介意并行运行所有getFileUri,则可以使用forkJoin收集所有响应,然后更新原始的File对象。

import { forkJoin } from 'rxjs';

getFiles().pipe(
  mergeMap(files => {
    const observables = files.map(file => this.getFileUri(file.filename));

    return forkJoin(...observables).pipe(
      map((urls: SafeUrl[]) => {
        urls.forEach((url, index) => files[index].safeUrl = url);
        return files;
      }),
    );
  ),
}).subscribe(files => ...);