Скажем, у меня есть кнопка «Связаться с нами» с подпиской на службу «Связаться с нами», которая возвращает наблюдаемое после запуска http-запроса.
Если пользователь нажимает кнопку 10 раз и отправляет 10 писем (желательно), будет ли выполняться 10 одновременных подписок? Если да, то как лучше всего очистить подписку в этом сценарии?
Вы можете проверить, закрыта ли текущая подписка. reactivex.io/rxjs/class/es6/…





просто сохраните подписку в свойстве и проверьте, существует ли она, не подписывайтесь, если нет, то подпишитесь
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 Я не понял, что вы имеете в виду, как вам отправлять электронные письма, если вы подпишетесь на наблюдаемое? Будет лучше, если вы поделитесь своим кодом
Я могу немного опубликовать код, однако у меня есть функция, которая вызывается кнопкой пользовательского интерфейса, которая затем подписывается на службу, которая вызывает метод веб-API для отправки электронной почты.
@ RandomUs1r Я обновил свой ответ, проверьте, что вам нужно
два нижних решения выглядят великолепно, но я использовал take (1), спасибо!
Вы можете избежать отказа от подписки, если добавите take(1) в канал при подписке - если вы подписываетесь несколько раз
В качестве альтернативы, вы можете иметь единую подписку в компоненте с кнопкой, которую вы инициализируете в ngOnInit() или в constructor. Сохраните ссылку на подписку в свойстве private contactSubscription: SubscriptionLike и вызовите contactSubscription && contactSubscription.unsubscribe в ngOnDestroy().
take (1) - очень лаконичный способ справиться с моим сценарием, спасибо!
Нет проблем, я узнал об этом, задавая вопросы и здесь! Спасибо за отзыв ?
Было бы проще, если бы вы показали код, который используете, поскольку от него во многом зависит ответ.