Как отменить 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);
}
);
});
Ответы
Ответ 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 будет выдавать последние значения для любых поздних подписчиков.