Очистка подписки Angular 6 при многократном нажатии кнопки

Скажем, у меня есть кнопка «Связаться с нами» с подпиской на службу «Связаться с нами», которая возвращает наблюдаемое после запуска http-запроса.

Если пользователь нажимает кнопку 10 раз и отправляет 10 писем (желательно), будет ли выполняться 10 одновременных подписок? Если да, то как лучше всего очистить подписку в этом сценарии?

Было бы проще, если бы вы показали код, который используете, поскольку от него во многом зависит ответ.

Ingo Bürk 27.11.2018 23:16

Вы можете проверить, закрыта ли текущая подписка. reactivex.io/rxjs/class/es6/…

wannadream 27.11.2018 23:31
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
2
647
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

просто сохраните подписку в свойстве и проверьте, существует ли она, не подписывайтесь, если нет, то подпишитесь

cacheSub: Subscription;

contactUs() {
  if (!this.cacheSub) {
     this.cacheSub = this.service.cacheSub.subscribe(....);
  }
}

РЕДАКТИРОВАТЬ

если вы хотите подписываться каждый раз и очищать каждую подписку, вы можете сделать

cacheSub: Subscription;

contactUs() {
     this.cacheSub = this.service.cacheSub.subscribe(() => {
        // some code here if you need it
        this.cacheSub.unsubscribe();
     });
}

или

contactUs() {
    this.cacheSub && this.cacheSub.unsubscribe();
    this.cacheSub = this.service.cacheSub.subscribe(() => {
            // some code here if you need it
    });
}

Я должен уточнить ... Я хочу иметь возможность нажать кнопку 10 раз и отправить 10 писем, мой вопрос больше: когда пользователь снова нажимает кнопку, что происходит или что мне делать с 1-й подпиской.

RandomUs1r 27.11.2018 23:02

@ RandomUs1r Я не понял, что вы имеете в виду, как вам отправлять электронные письма, если вы подпишетесь на наблюдаемое? Будет лучше, если вы поделитесь своим кодом

Artyom Amiryan 27.11.2018 23:04

Я могу немного опубликовать код, однако у меня есть функция, которая вызывается кнопкой пользовательского интерфейса, которая затем подписывается на службу, которая вызывает метод веб-API для отправки электронной почты.

RandomUs1r 27.11.2018 23:08

@ RandomUs1r Я обновил свой ответ, проверьте, что вам нужно

Artyom Amiryan 27.11.2018 23:13

два нижних решения выглядят великолепно, но я использовал take (1), спасибо!

RandomUs1r 28.11.2018 00:14
Ответ принят как подходящий

Вы можете избежать отказа от подписки, если добавите take(1) в канал при подписке - если вы подписываетесь несколько раз

В качестве альтернативы, вы можете иметь единую подписку в компоненте с кнопкой, которую вы инициализируете в ngOnInit() или в constructor. Сохраните ссылку на подписку в свойстве private contactSubscription: SubscriptionLike и вызовите contactSubscription && contactSubscription.unsubscribe в ngOnDestroy().

take (1) - очень лаконичный способ справиться с моим сценарием, спасибо!

RandomUs1r 28.11.2018 00:13

Нет проблем, я узнал об этом, задавая вопросы и здесь! Спасибо за отзыв ?

Drenai 28.11.2018 11:06

Другие вопросы по теме