Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用可管道RxJs操作符实现复杂的文件上传场景?_Javascript_Angular_Rxjs_Reactive Programming - Fatal编程技术网

Javascript 使用可管道RxJs操作符实现复杂的文件上传场景?

Javascript 使用可管道RxJs操作符实现复杂的文件上传场景?,javascript,angular,rxjs,reactive-programming,Javascript,Angular,Rxjs,Reactive Programming,我有一个场景,需要按顺序将一系列文件上载到web服务器,每个文件都需要分块。当按程序实现时,上载过程非常简单,大致如下所示: foreach file in files: const result = await createMultipartUpload(); do { const chunk = takeChunk(); const result = await uploadChunk(chunk); chunksRemain = doChunksRema

我有一个场景,需要按顺序将一系列文件上载到web服务器,每个文件都需要分块。当按程序实现时,上载过程非常简单,大致如下所示:

foreach file in files:
  const result = await createMultipartUpload();

  do {
    const chunk = takeChunk();
    const result = await uploadChunk(chunk);

    chunksRemain = doChunksRemain();
  } while (chunksRemain);

  await completeUpload();

也就是说,对于每个顺序上传过程,会发生一个创建请求,多个区块会顺序上传,但我不知道会上传多少区块,然后会发生一个完成请求

我需要用RxJs将其转换为反应式代码。我所做的实际上适用于单块上传,其中只需要一个块。但是我还没有弄清楚如何动态地生成upload chunk Observable并将它们推到某种数组上,然后从中检索它们

以下是我目前掌握的情况:

//包含单个请求。
公共createMultipartUpload(文件:file):可观察{
返回这个.filesHttp.store(文件);
}
//包含两个HTTP请求。生成一个预签名的URL,然后上载带有预签名URL的区块。
公共上载块(文件:file):可观察{
let chunk:Blob;
//确定要获取并分配给区块的文件字节。
if(file.originalFile.size{
返回这个.filesHttp.upload(res.uri,chunk);
}),
地图(f=>{
//设置要获取的下一个块
f、 currentByteOffset+=此.chunkSize;
返回f;
})
);
}
公共completeUpload(文件:file):可观察{
返回此.filesHttp.complete(文件);
}
来自(this.files)
.烟斗(
concatMap(f=>this.createMultipartUpload(f)),
switchMap(f=>this.uploadChunk(f)),
concatMap(f=>this.completeUpload(f))
).subscribe(输出=>{
//完成了吗?
});

在这种情况下,如何顺序上传所有数据块,而不仅仅是第一个数据块?

使用
expand
处理动态的可观察数据量
expand
递归地映射到一个可观察对象,并接收其输出作为下一个输入。通过返回
EMPTY
结束此递归

//使用concat逐个上传多个文件
concat(…this.files.map(file=>uploadFile(file))).subscribe(console.log);
//使用expand将单个文件上载到多个块中

uploadFile(文件):可观察

您可以查看
扩展
操作符,以便在块上顺序上传。我在这里回复了一些非常类似的问题:太好了,谢谢!我不知道
扩展了
,但这正是解决这个问题所需要的。