嵌套订阅块是一种反模式。您的代码很容易受到多种竞争条件的影响。您正在处理http调用之间的内部服务状态。这意味着如果有多个调用激发到
saveClientToDatabase
很快,其中一些可能会以错误数据告终。
请尝试以下操作:
import { mergeMap } from 'rxjs/operators';
import { of } from 'rxjs/observable/of';
import { forkJoin } from 'rxjs/observable/forkJoin';
const hasCompanion = this.rent.companion.id !== -1;
const rent = this.rent;
const saveClient$ = this.clientService.saveClientToDatabase(rent.client);
const saveCompanion$ = hasCompanion ? this.clientService.saveCompanionToDatabase(rent.companion) : of(null);
const saveRent$ = forkJoin([saveClient$, saveCompanion$]).pipe(mergeMap(([client, companion]: [any, any]) => {
return this.rentServices.saveRentToDatabase(companion ? {
...rent,
clientID: client.clientID,
companion: companion.companionID
} : {
...rent,
clientID: client.clientID,
})
}));
saveRent$.subscribe(rent => this.rent = rent);