У меня есть следующий код:
m_SystemOptions: KeyValueEntity[];
OnInitializeFramework(): any
{
this.GetSystemSettings().subscribe(
response =>
{
if (response.IsSuccess)
{
this.m_SystemOptions = response.Entities;
}
else
{
this.UnexpectedMessage(response.ResponseMessage);
}
});
}
В идеале я хотел бы, чтобы это было примерно так:
this.m_SystemOptions = this.GetSystemSettings().SomeMagic()
or
this.m_SystemOptions = SomeMagic(this.GetSystemSettings());
or at the very worst:
SomeMagic(this.GetSystemSettings(), this.m_SystemOptions);
this.GetSystemSettings - это функция, которая возвращает тот же тип, что и this.m_SystemOptions
Поскольку мой код имеет эту структуру десятки раз, я хотел бы сократить его
Все, что мне не хватает, это SomeMagic()
РЕДАКТИРОВАТЬ:
Я пропустил небольшую, но важную часть. GetSystemSettings() не возвращает тот же тип напрямую, но обернут в некоторую структуру управления, которая совместно используется в приложении. Внутри этого есть в основном просто вызов httpClient. get(), который возвращает подписку, я бы хотел не касаться этой части, ее тонкой и общей информации. Я хотел бы удалить повторяющуюся часть, которую я опубликовал выше, которая обрабатывает как успешный ответ, так и неудачу и изменяет его на нечто более общее сделать код в компоненте более удобочитаемым
export class BaseResponse
{
IsSuccess: boolean;
ResponseCode: number;
ResponseMessage: string;
ResponseExtendedMessage: string;
}
export abstract class BaseEntitiesResponse<TEntity extends BaseEntity> extends BaseResponse { Entities: TEntity[] }
export class KeyValueEntity extends BaseEntity
{
Key: string;
Value: string;
}
//Get the settings
private GetSystemSettings(): Observable<BaseEntitiesResponse<KeyValueEntity>>
{
return this.api.ExecuteGetAction("System", "SystemOptions");
}
Она не идеальна, чтобы subscribe
на вызов метода. Вы должны подписаться только тогда, когда вам это нужно, поэтому Observable
называется "ленивым". ваш GetSystemSettings
должен выглядеть примерно так:
this.GetSystemSettings().pipe(map(
response =>
{
if (response.IsSuccess)
{
return response.Entities;
}
else
{
return []; // Error message can be handled more gracefully :)
}
}));
и подписаться на метод
this.GetSystemSettings().subscribe(entities => this.m_SystemOptions = entities);