Я создаю сервис, который должен открыть модальный режим и запустить цепочку 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)),
);