ho creato un servizio che rende una semplice richiesta GET:richiesta HTTP effettuata più volte in servizio Angular2
private accountObservable = null;
constructor(private _http: Http) {
}
getAccount() {
// If we have account cached, use it instead
if (this.accountObservable === null) {
this.accountObservable = this._http.get('http://localhost/api/account')
.map(res => <Account> res.json().data)
.catch(this.handleError);
}
return this.accountObservable;
}
ho aggiunto che il servizio nella mia funzione di bootstrap per fornire a livello globale (la mia speranza è di fornire al stessa istanza a tutti i componenti):
provide(AccountService, { useClass: AccountService })
Il problema è quando chiamo questo servizio in diversi componenti, una richiesta GET viene effettuata ogni volta. Quindi, se lo aggiungo a 3 componenti, verranno fatte 3 richieste GET anche se controllo se esiste già un osservabile.
ngOnInit() {
this._accountService.getAccount().subscribe(
account => this.account = account,
error => this.errorMessage = <any>error
);
}
Come si può impedire che la richiesta GET venga eseguita più volte?
Si sta solo fornendo il servizio a livello di bootstrap? (Sembra che potresti elencarlo nella matrice 'providers' in tutti i tuoi componenti, che creerebbe 3 istanze del tuo servizio). Se lo fornisci solo a livello di bootstrap, prova a utilizzare [Observable.share()] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md) . (Queste sono tutte solo supposizioni da parte mia.) –
Vedere anche http://stackoverflow.com/a/35527616/215945 per un'implementazione leggermente diversa della memorizzazione nella cache di un risultato del server. –
Sì, ho solo 'fornire' su bootstrap. Ho provato ad aggiungere console.log() nel costrutto del servizio e viene attivato una sola volta. Ho aggiunto 'share()' dopo 'get()' ma non ha fatto alcuna differenza. Anche l'altro post non ha funzionato. Immagino sia perché finché non avremo ricevuto i dati, verrà fatta una nuova richiesta. Quindi se 3 componenti eseguono getAccount() allo stesso tempo, tutti eseguiranno le richieste e non si fermeranno finché uno di loro non avrà risposta. – Christoffer