javascript - Er der en måde at tilmelde sig igen efter at have afmeldt RxJS?


Her er et eksempel på kode, der abonnerer på en Http-anmodning og annullerer den ved klik med musen på siden. Jeg vil gerne abonnere igen, hvis jeg klikker igen.

Hvordan kan jeg skifte abonnement? 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 ) )
  }

}

Med ovenstående kode er jeg i stand til at annullere anmodningen, hvis jeg klikker på siden inden for 2 sekunder. Men jeg er ikke i stand til at tilmelde mig igen ved at klikke igen.

Det ville også være fantastisk, hvis nogen kunne fortælle mig, om jeg virkelig annullerer HTTP-forespørgslen med unsubscribe()? Eller er det bare en illusion? Vil forespørgslen ramme serveren, hvis jeg afmelder inden for 2 sekunder?

Svar #1

Din kode har en logisk fejl, bare en stavefejl, tror jeg.

this.flag != this.flag;

Du mente sandsynligvis

this.flag = !this.flag;

Forresten (uden relation til dit problem) er din metode til at få dokumentklik en ikke-angular metode, og du kan støde på problemer med, at siden ikke opdateres. Overvej i stedet at bruge en HostListener:

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

Afmeldelse af HTTP-anmodningen bør annullere anmodningen. Du har dog ingen garanti for at vide, om anmodningen faktisk nåede serveren eller ej - serveren kan allerede have svaret på det tidspunkt, hvor du afmeldte.

Her er en ryddet-up stackblitz: https://stackblitz.com/edit/angular-fzlzcf