2016-04-08 5 views
26

Come annullare un HTTPRequest in Angular 2?Come cancellare un HTTPRequest in Angular 2?

So come rifiutare la richiesta solo promessa.

return new Promise((resolve, reject) => { 
    this.currentLoading.set(url, {resolve, reject}); 

    this.http.get(url, {headers: reqHeaders}) 
     .subscribe(
      (res) => { 
       res = res.json(); 

       this.currentLoading.delete(url); 
       this.cache.set(url, res); 

       resolve(res); 
      } 
     ); 
}); 

risposta

28

È possibile chiamare unsubscribe

let sub = this.http.get(url, {headers: reqHeaders}) 
      .subscribe(
       (res) => { 
        res = res.json(); 

        this.currentLoading.delete(url); 
        this.cache.set(url, res); 

        resolve(res); 
       } 
      ); 

sub.unsubscribe(); 

Maggiori informazioni qui: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http

+1

Questa risposta non è più valido in beta.15. Non è disponibile il metodo "annulla iscrizione" in Osservabile ora. – tom10271

+1

'unsubscribe' è stato sostituito da' dispose'. – Menello

+1

Sto usando RC.5 di Angular2 e 'unsubscribe' è presente (versione 5.0.0-beta.6 di rxjs). Forse è stato ripristinato da quando sono stati fatti i commenti? Non sono sicuro da dove provenga la discrepanza. –

20

È possibile l'uso della seguente soluzione semplice.

if (this.subscription) { 
    this.subscription.unsubscribe(); 
} 
this.subscription = this.http.get('awesomeApi') 
.subscribe((res)=> { 
    // your awesome code.. 
}) 
+1

funziona perfettamente con Angular 2.4.6 - Questa dovrebbe essere la risposta accettata –

+0

Se questo è corretto, dovrei contrassegnare quello di @ TGH come risposta – tom10271

+0

È possibile farlo tramite il metodo '.toPromise()' e 'then()', 'catch()'? –

3

Un po 'tardi per il partito, ma qui è il mio introito:

import { Injectable } from '@angular/core' 
import { Http } from '@angular/http' 
import { Observable } from 'rxjs/Observable' 
import { Subscriber } from 'rxjs/Subscriber' 

@Injectable() 
export class SomeHttpServiceService { 
    private subscriber: Subscriber<any> 
    constructor(private http: Http){ } 

    public cancelableRequest() { 
    let o = new Observable(obs => subscriber = obs) 
    return this.http.get('someurl').takeUntil(o) 
     .toPromise() //I dont like observables 
     .then(res => { 
     o.unsubscribe 
     return res 
     }) 
    } 
    public cancelRequest() { 
    subscriber.error('whatever') 
    } 
} 

Ciò consente di annullare manualmente una richiesta. A volte mi ritrovo con un osservabile o una promessa che apporterà modifiche a un risultato sulla pagina. Se la richiesta è stata avviata automaticamente (l'utente non ha scritto nulla in un campo per x millis) la possibilità di annullare la richiesta è buona (l'utente improvvisamente digita nuovamente qualcosa) ...

takeUntil dovrebbe anche funzionare con un semplice timeout (Observable.timer) se è quello che state cercando https://www.learnrxjs.io/operators/filtering/takeuntil.html

+1

Perché non ti piacciono gli osservabili? Per http è lo stesso come la promessa, ma ha anche un errore e completo – Mick

+0

@Mick, penso che il clearfix è stato semplicemente accomodante preferenza del OP per le promesse, non esprimendo la sua opinione. #theSpiritOfStackOverflow – Rap