В моем проекте Angular я описал один случай следующим образом:
В интерфейсе Frontend у меня есть языковая система, пользователь может выбрать один из вариантов. И каждый раз, когда пользователь выбирает новый язык, мне нужно вызвать с ним метод серверной стороны subscribe
, и, если он успешно запущен, он вернется к subscriptionid
.
В следующий раз, когда пользователь поменяет новый язык, мне нужно будет создать новую подписку. Но перед этим мне нужно unsubscribe
текущий. Демонстрационный код выглядит следующим образом:
this.start().subscribe((res) => {
// store current subscription id
this.currentSubscriptionId = res.SubscriptionId;
});
private start(): Observable<{ [key: string]: string }> {
return this.xService.language$.pipe(
switchMap((language) =>
this.unsubscribe().pipe(
switchMap((_) => this.invoke("subscribe",language)) // this.invoke return observable<any>
)
)
);
}
private unsubscribe(): Observable<any> {
if (this.currentSubscriptionId) { // default initial value is empty string ""
return this.invoke("Unsubscribe", {
Id: this.currentSubscriptionId
});
} else {
return of("");
}
}
, поэтому я использую переменную состояния currentSubscriptionId
для этого потока. Значение по умолчанию - пустая строка, поэтому в первый раз нет необходимости вызывать метод unsubscribe
, возвращать наблюдаемую of
.
В текущей реализации я инкапсулирую внутреннюю функцию logi c в unsubscribe
и на основе переменной состояния currentSubscriptionId
для управления потоком.
Есть ли другое оптимизированное решение для этого случая? выполните этот вид контроля в стиле Rx JS.