【发布时间】:2019-08-20 07:27:44
【问题描述】:
我正在使用 Angular 进行文件加密和上传类。其中许多操作都是异步的,因此我编写的方法返回的是 RxJS Observables。
// 1.
private prepareUpload(file): Observable<T>;
// 2.
private encryptData(data, filekey): Observable<T>
// 3.
private uploadEncryptedData(formData, token, range): Observable<T>
// 4.
private completeUpload(updatedFilekey, token): Observable<T>
我想将这个逻辑封装在一个公共的upload(file) 方法中,我最终使用了嵌套订阅并且它有效,但我知道它是错误的,并且出于多种原因在 RxJS 中是一种反模式。这是代码的简化版本:
public upload(file) {
const gen = this.indexGenerator(); // generator function
this.prepareUpload(file).subscribe(values => {
const [response, filekey, data] = values;
this.encryptData(data, filekey).subscribe(encryptedDataContainer => {
const formData = this.prepareEncDataUpload(encryptedDataContainer.data, file.name)
const range = this.getRange(file.size, gen.next().value);
this.uploadEncryptedData(formData, response.token, range).subscribe(() => {
if (range.isFinalPart) {
this.completeUpload(encryptedDataContainer.updatedFilekey, response.token).subscribe(console.log);
}
});
});
});
}
我未能使用多个 RxJS 运算符的组合来清理此代码。我的目标是避免嵌套订阅,而是在工作流完成时从公共 upload() 方法返回单个 Observable。
谢谢!
【问题讨论】:
-
也许你想看看
streams到 -
也许你可以使用 RxJS "toPromise" 函数,这样你就可以一个接一个地放置你的函数而不是嵌套订阅
-
我认为链接你的 observables 就可以了,你可以用
flatMap来做 - stackoverflow.com/a/37777382/9176461 和 stackoverflow.com/questions/34701304/…