2017-10-20 12 views
0

J'ai un écran avec une liste de gauche ayant des liens différents et le côté droit montrant les détails de chacun. J'utilise le service ci-dessous pour obtenir les détails.Annuler les demandes précédentes et attraper les erreurs dans Angular 4 http

getDetails(id: string) : Observable<any>{ 
    const url = `${environment.server}/api/details/${id}` 
    return Observable.of(1) 
     .debounceTime(2000) 
     .switchMap(() => this.http.get(url)) 
     .map(r => r.json()) 
} 
  1. Est-ce une bonne approche pour utiliser Observable.of(1)1 n'a pas de signification? Y a-t-il une approche différente?
  2. Est-ce ainsi que nous empêchons plusieurs clics/demandes de détails et ne répondons qu'au plus récent?
  3. Dans ce cas, comment puis-je détecter les erreurs dans http?

Répondre

0

Quel est votre objectif final ici? En ce qui concerne

1) Je voudrais simplement faire comme ceci: this.http.get(url).map(res => res.json()),

2) bien, dépend de votre mise en œuvre, mais en général je voudrais juste mettre un drapeau booléen pour éviter de multiples demandes comme ceci:

return new Observable(done => { 
    if (!this.myQueryIsRunning) { 
     this.myQueryIsRunning = true; 
     this.http.get(url).map(res => res.json()).subscribe(myData=> { 
     this.myQueryIsRunning = false; 
     done.next(data); 
     done.complete(); 
     }) 
    } else { 
     done.complete(); // or throw an error like done.error('my error'); 
    } 

3) ne savez pas ce que vous voulez dire. Vous pouvez toujours attraper une erreur comme ceci:

this.http.get(url).map(res => res.json()).subscribe(myData=> { 
    this.myQueryIsRunning = false; 
    done.next(data); 
    done.complete(); 
}, hereIsAnError => { 
    // do something about it 
}) 
+0

La principale chose que je veux est devrait être annulée dès qu'une nouvelle demande est faite, il ne devrait pas continuer Procesing dernier appel après est fait un nouvel appel les appels précédents http. – sabithpocker

+0

vous voudrez peut-être vérifier cela: [link] (https://stackoverflow.com/questions/36490926/how-to-cancel-a-httprequest-in-angular-2) mais honnêtement, je voudrais encore essayer de trouver un manière d'éviter cela. Lorsque vous annulez/désinscrivez une requête, cela ne signifie pas que le serveur arrête de faire quoi que ce soit. Sur le côté serveur, la demande sera traitée comme d'habitude. Pour éviter de surcharger le serveur avec des requêtes inutiles, vous pouvez reconsidérer :) jm2c – djnose

+0

@djnjsone Merci pour votre suivi. Je comprends cela lentement et je me désabonne pour annuler les demandes précédentes. Mais comme vous l'avez mentionné, est-il possible d'éviter de surcharger le serveur avec des requêtes inutiles? – sabithpocker