1.0.6 • Published 2 years ago

sat-decorators v1.0.6

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

SATDirectives Библиотека полезных декораторов

Исходный код

Видео

Декоратор кеширования

Получить всех авторов, если авторы уже считывались, то они находятся в кэше и берутся из него

@cachedRequest()
public GetAllAuthor()
{
  return this.http.get<Author[]>(`${this.baseUrl}/api/Authors`);
}

Передача фабрики для получения кэша

const cache = { [key: string]: Observable<any> | undefined } = {};
@cachedRequest(function () { return this.cache; })

Передача времени жизни кэша (в примере 300 сек = 5 мин)

@cachedRequest(300)

Передача времени жизни кэша (в примере 300 сек = 5 мин) и фабрики для получения кэша

const cache = { [key: string]: Observable<any> | undefined } = {};
@cachedRequest(300, function () { return this.cache; })

Проверка существования кэша

hasCache(this, 'myFunction', ...args);

args - аргументы, могут отсутствовать

Удаление кэша

removeCache(this, 'myFunction', ...args);

args - аргументы, могут отсутствовать

Декоратор повторных попыток

@delayRetry()

// В качестве аргументов принимает 
// delayMs: number = 1000 
// maxRetry: number = 3
// filter: (name: string) => boolean = (name: string) => true

Применяется как к функциям, так и к классам

для целого класса, все функции которые возвращают Observable, будут с повторными попытками при возникновении ошибки

@Injectable({ providedIn: 'root' })
@delayRetry()
export class ApiClientService
{
  constructor(
    private readonly http: HttpClient,
    @Inject('BASE_URL') private readonly baseUrl: string,
    private readonly cache: CacheService
  ) { }

  // Получить всех авторов
  public GetAllAuthor()
  {
    return this.http.get<Author[]>(`${this.baseUrl}/api/Authors`);
  }

  // Получить автора по уникальному идентификатору
  public GetAuthorById(id: number)
  {
  return this.http.get<Author[]>(`${this.baseUrl}/api/Authors/${id}`);

Для для отдельной функции

  // Получить всех авторов
  @delayRetry()
  public GetAllAuthor()
  {
    return this.http.get<Author[]>(`${this.baseUrl}/api/Authors`);
  }

Декоратор автоматической подписки и отписки

В соответствии с жизненным циклом, при инициализации произойдёт подписка на work(), а при уничтожении отписка

import { AutoSubscribe } from 'sat-decorators';
export class WithAutoSubscribeComponent
{
  str1?: string;
  constructor(private readonly s_subs: SubsService) { }    
  @AutoSubscribe() work()
  {
    return this.s_subs.observer1$.pipe(
      tap(str =>
      {
        console.log(str);
        this.str1 = str;
      })
    );
  }
}
import { AutoSubscribe } from 'sat-decorators';
export class WithAutoSubscribeComponent
{
  str1?: string;
  constructor(private readonly s_subs: SubsService) { }    
 @AutoSubscribe({
    isAutoSubscribeOnInit: true,
    onNext: WithAutoSubscribeComponent.prototype.onNext,
    onError: WithAutoSubscribeComponent.prototype.onError
  }) work()
  {
    return this.s_subs.observer1$;
  }

  onNext(str: string) { console.log(str); }
  onError(err: any) { console.log(err); }
}

Подписка на work() произойдёт только при самостоятельном вызове метода, а вот отписка в соответствии с жизненным циклом при уничтожении:

import { AutoSubscribe } from 'sat-decorators';
export class WithAutoSubscribeComponent
{
  str1?: string;
  constructor(private readonly s_subs: SubsService) { }
   
  ngOnInit()
  {
    work();
  }  
   
  @AutoSubscribe({ isAutoSubscribeOnInit: false }) work()
  {
    return this.s_subs.observer1$.pipe(
      tap(str =>
      {
        console.log(str);
        this.str1 = str;
      })
    );
  }
}

Для компонента или директивы автоматически подпишется и отпишется по завершению жизненного цикла

Декоратор защиты от утечек памяти

Необходим для того что бы проводить некоторые действия только по достижению определённого состояния и контролировать утечку памяти

В данном примере @SubscribeGuard гарантирует нам что у user$ подписчики будут удалятся по получению состояния, так же важно отметить, что для компонента или директивы отрабатывают жизненный цикл, т.е. если компонент или директива будут уничтожены, то и подписка будет прекращена

test(): void
{
  this.observer()
    .pipe(switchMap(() => observer$))
    .subscribe(str =>
    {
      console.log(str);
    });
}

@SubscribeGuard()
observer()
{
  return user$
    .pipe(filter(u => !!u));
}
1.0.6

2 years ago

1.0.5

2 years ago

1.0.3

2 years ago