2016-04-08 2 views
26

Как отменить HTTPRequest в Angular 2?Как отменить HTTPRequest в Angular 2?

Я знаю, как отклонить запрос только.

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); 
      } 
     ); 
}); 

ответ

28

Вы можете позвонить 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(); 

Подробнее здесь: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http

+1

Этого ответа больше не действует в бета-версии.15. В Observable нет метода 'unsubscribe'. – tom10271

+1

'unsubscribe' был заменен' dispose'. – Menello

+1

Я использую RC.5 Angular2, и присутствует 'unsubscribe' (версия 5.0.0-beta.6 из rxjs). Возможно, он был восстановлен после того, как были сделаны замечания? Не знаете, откуда происходит несоответствие. –

20

Вы можете использование следующее простое решение.

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

отлично работает с Angular 2.4.6 - Это должен быть принятый ответ –

+0

Если это правильно, я должен отметить @ TGH как ответ – tom10271

+0

Возможно ли это с помощью метода .toPromise() 'и' then() ',' catch() '? –

3

Немного поздно для партии, но вот мое взятие:

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') 
    } 
} 

Это позволяет вручную отменить запрос. Иногда я получаю наблюдаемый или обещающий, который внесет изменения в результат на странице. Если запрос был инициирован автоматически (пользователь не набирал noting в поле для x millis), возможно, удастся выполнить запрос (пользователь неожиданно печатает что-то снова) ...

takeUntil также должен работать с простым Тайм-аут (Observable.timer), если это то, что вы ищете https://www.learnrxjs.io/operators/filtering/takeuntil.html

+1

Почему вы не любите наблюдаемые? Для http это то же самое, что и обещание, но также имеет ошибку и завершает – Mick

+0

@ Мик, я думаю, clearfix просто приспосабливал предпочтения OP к обещаниям, не выражая его/ее мнение. #theSpiritOfStackOverflow – Rap

Смежные вопросы