http - forkjoin - switchmap
¿Cómo cancelar un HTTPRequest en Angular 2? (5)
Puede usar SwitchMap en el observable que cancelará cualquier respuesta de solicitud anterior y solo solicitará la última:
https://www.learnrxjs.io/operators/transformation/switchmap.html
¿Cómo cancelar un HTTPRequest en Angular 2?
Solo sé rechazar la promesa de solicitud.
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);
}
);
});
Puede utilizar la siguiente solución simple.
if ( this.subscription ) {
this.subscription.unsubscribe();
}
this.subscription = this.http.get( ''awesomeApi'' )
.subscribe((res)=> {
// your awesome code..
})
Puedes llamar para
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();
Más información aquí: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http
Un poco tarde para la fiesta, pero aquí está mi opinión:
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'')
}
}
Esto le permite cancelar manualmente una solicitud. A veces termino con una observación o promesa que hará cambios a un resultado en la página. Si la solicitud se inició automáticamente (el usuario no escribió nada en un campo para x millis), es posible cancelar la solicitud (el usuario vuelve a escribir algo de repente) ...
takeUntil también debería funcionar con un tiempo de espera simple (Observable.timer) si eso es lo que está buscando https://www.learnrxjs.io/operators/filtering/takeuntil.html
Use
switchMap
[docs]
, que cancelará todas las solicitudes en vuelo y usará solo las últimas.
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 emitirá el último valor para los suscriptores tardíos.