Использование субъекта и наблюдаемых в качестве параметров службы ввода / вывода, чтобы избежать зависимости от структуры http request / reponse и службы, обеспечивающей вызовы http - PullRequest
0 голосов
/ 29 сентября 2018

Я создаю сервис, который должен открыть модальный режим и запустить цепочку http-вызовов при определенных взаимодействиях с пользователем.API-интерфейсы, которые мне нужно вызвать, зависят от реального контекста, в котором используется служба, а также от параметров API.Я хотел избежать необходимости определять обратные вызовы для использования моего сервиса или использовать httpService (или его обернутую версию) в качестве параметра, так как тогда он должен будет реализовать определенные методы, ожидаемые моим сервисом, - чтобы сделать использование максимально простым.Кроме того, избегать обратных вызовов было внешним ожиданием.

Я все еще изучаю rxjs, и не уверен, является ли это приемлемым решением с использованием подобного предмета, или есть лучшие способы?

Этобезопасны ли утечки памяти для использования Subject таким образом?

Я предполагал, что использование takeUntil и вызов next на destroy $ отменит любую подписку на моем конце, и все будет собирать мусор, когда модал открывается службой и родителем.компонент как уничтожен.В идеале одновременно может быть активен только один модальный компонент, но я не знаю, не будет ли в памяти браузера нескольких экземпляров в любой момент времени, поэтому я не уверен, выставляю ли одно / глобальное свойство Subject всервис будет хорошей идеей.

export class myService {
  doStuff(
    subject: Subject<InputType>,
    mappedSubject: Observable<ResponseType1>,
    otherAPICall: Observable<ResponseType2>,
  ) {
    return this.dialog.open({data: { subject, mappedSubject, otherAPICall });
  }
}

в модальном режиме:

private destroy$ = new Subject();

ngAfterViewInit() {
  this.data.mappedSubject.pipe(
    takeUntil(this.destroy$),
    flatMap(result => {
      if (result.allGood) return this.data.otherAPICall;
       Observable.throw("not good");
    }),
  ).subscribe(result => displayResult(result));
}

doOnButtonClick() {
  this.data.subject.next(this.form.get("myInput").value);
}

ngOnDestroy() {
  this.destroy$.next();
  this.destroy$.complete();
}

использование в другом компоненте:

const subject = new Subject()<InputType>;
this.myService.doStuff(
  subject,
  subject.pipe(
    flatMap(inputValue => this.httpService1.call(this.transform(inputValue))),
    map(x => (x as ResponseType1)),
  ),
  this.httpService2.call(params).pipe(map(x => (x as ResponseType2)),
);

1 Ответ

0 голосов
/ 29 сентября 2018

Единственное беспокойство - почему мы передаем Subject как свойство данных внутри open ().Используя DI, вы можете внедрить службу в любом месте конструктора Компонента / Службы и получить к ней доступ прямо здесь.

Избегайте передачи темы, это может привести к потреблению памяти и проблемам с производительностью.

Вместо использования flatMap, вы можете попробовать switchMap.Это отменит предыдущий исходный наблюдаемый вызов Http, если он активен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...