Javascript 使用可管道RxJs操作符实现复杂的文件上传场景?
我有一个场景,需要按顺序将一系列文件上载到web服务器,每个文件都需要分块。当按程序实现时,上载过程非常简单,大致如下所示: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
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(文件):可观察您可以查看扩展
操作符,以便在块上顺序上传。我在这里回复了一些非常类似的问题:太好了,谢谢!我不知道扩展了,但这正是解决这个问题所需要的。