Подтвердить что ты не робот

Как отменить 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);
            }
        );
});
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 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')
  }
}

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

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

Ответ 4

Вы можете использовать SwitchMap для наблюдаемой, которая отменяет любые предыдущие ответы на запросы и запрашивает только самые последние:

https://www.learnrxjs.io/operators/transformation/switchmap.html

Ответ 5

Используйте switchMap [docs], который отменит все запросы в полете и использует только самые последние.

get(endpoint: string): Observable<any> {
        const headers: Observable<{url: string, headers: HttpHeaders}> = this.getConfig();
        return headers.pipe(
            switchMap(obj => this.http.get('${obj.url}${endpoint}', { headers: obj.headers, params: params }) ),
            shareReplay(1)
        );
    }

shareReplay будет выдавать последние значения для любых поздних подписчиков.