Это уже один из оптимальных способов сделать это. Как вы знаете, HTTP-запросы являются асинхронными, поэтому они делают что-то вроде:
this.addressService.getAddressFormatAll().subscribe()
this.addressHeaderForm.patchValue({ addressFormat: this.defaultAddressFormat });
Не будет работать, так как метод patchValue
будет вызван до того, как getAddressFormatAll
будет подписан и возвращен.
Следовательно, ваш код действителен, и я не думаю, что есть необходимость что-либо менять в нем.
Конечно, вы можете использовать его как побочный эффект через конвейер Rx JS, но это не принесет дополнительных преимуществ, если вы не работаете с другими операциями, такими как дополнительные асинхронные методы для быть вызванным.
this.addressService.getAddressFormatAll()
pipe(
tap((res) => {
this.addressFormatList = res.body;
if (this.addressFormatList.length > 1) {
this.addressHeaderForm.patchValue({ addressFormat: this.defaultAddressFormat });
}
}),
).subscribe();
В качестве альтернативы, вы можете использовать асин c трубу. Одним из преимуществ этого является то, что вам не нужно вручную отписываться от подписки на вашем компоненте.
this.addressFormatList = this.addressService.getAddressFormatAll()
И на вашем компоненте. html,
<mat-option
*ngFor="let addressFormatItem of addressFormatList | async"
[value]="addressFormatItem"
>