Есть ли способ повторно подписаться после отписки от RxJS? - PullRequest
1 голос
/ 23 июня 2019

Вот пример кода, который подписывается на Http-запрос и отменяет его при щелчке мышью на странице.Я хотел бы повторно подписаться, если я выполню щелчок еще раз.

Как я могу переключить подписку? FIDDLE

export class AboutComponent implements OnInit {
constructor(private http:HttpClient){
}

flag=true;
documentclick = fromEvent(document, 'click');

 private data = {
    name:  'Samurai',
    profession:  'Developer'
  };
  ngOnInit(){

    let subscription:Subscription = this.getGoogle()   )
    .subscribe((res)=> {
     console.log(res);
   })

    this.documentclick.subscribe( e=>{
      if(this.flag){
        subscription.unsubscribe();
      }
      else{
        subscription = this.getGoogle().subscribe((res)=> {
          console.log(res);
        });
      }
      this.flag != this.flag;

    });
  }

getGoogle(): Observable<any> {
    return   this.http.get( 'https://jsonplaceholder.typicode.com/todos/1').pipe ( delay( 2000 ) )
  }

}

С помощью вышеуказанного кода я могу отменить запрос, если я нажму на страницу в течение 2 секунд.Но я не могу подписаться снова при повторном нажатии.

Кроме того, было бы замечательно, если бы кто-нибудь сказал мне, действительно ли я отменяю запрос http с помощью unsubscribe ()?Или это просто иллюзия?Будет ли запрос попадать на сервер, если я откажусь в течение 2 секунд?

1 Ответ

0 голосов
/ 23 июня 2019

Ваш код содержит логическую ошибку, я думаю, что это просто опечатка.

this.flag != this.flag;

Вы, вероятно, имели в виду

this.flag = !this.flag;

Кстати, ваш метод получения кликов по документам (не связанный с вашей проблемой) не является угловым, и вы можете столкнуться с проблемами, когда страница не обновляется. Попробуйте вместо этого использовать HostListener:

@HostListener('document:click', ['$event'])
clicked(event) {
    ..
}

Отмена подписки на запрос HTTP должна отменить запрос. Однако у вас нет гарантированного способа узнать, действительно ли запрос поступил на сервер или нет - сервер, возможно, уже ответил к тому времени, когда вы отписались.

Вот очищенный стек стека: https://stackblitz.com/edit/angular-fzlzcf

...