Мне удалось решить мою проблему благодаря @martin, указавшему мне правильное направление.
Я изменяю mapProgress2()
тип возвращаемого значения на Observable<IUploadProgress>
, затем использую flatMap для выравнивания внутренней наблюдаемой.
Мои знания о rxjs очень ограничены, но я считаю, что для сценария flatMap
, switchMap
или concatMap
будет достаточно. @martin предложил concatMap
и после прочтения документов я согласен.
Из Документы RXJS
flatMap: flatMap - это псевдоним для mergeMap!
mergeMap: если вы хотите сохранить более одной внутренней подписки, попробуйте mergeMap
switchMap: если одновременно активна только одна внутренняя подписка, попробуйте switchMap
concatMap: Если важен порядок распространения и подписки внутренних наблюдаемых, попробуйте concatMap
updateCertificate(file: File): Observable<IUploadProgress> {
return this._azureBlobStorage
.uploadCertificateToBlobStorage2(file, this.portalKey)
.pipe(
flatMap(progress => this.mapProgress2(progress))
);
}
private mapProgress2(fileProgress: IUploadProgress): Observable<IUploadProgress> {
if (fileProgress.progress === 100) {
return this._httpClient.post(this._portalDetails + 'certificatePath', JSON.stringify(fileProgress.filename))
.pipe(map(res => fileProgress));
} else {
return Observable.create(function(observer) {
observer.next(fileProgress);
observer.complete();
});
}
}