Ich habe einen "Token" Dienst, der ein Access-Token zurückgibt. Dann habe ich viele andere Dienste, die diesen Dienst verwenden, um ein Zugriffstoken zu erhalten, bevor sie einen API-Aufruf an das Back-End mit dem Token, das in dem Anforderungsheader enthalten ist, vornehmen können.angular2: get und Cache-Token nur einmal
Das Problem ist, dass viele dieser Dienste fast gleichzeitig die Token Dienst anrufen, so vor dem ersten Aufruf der Tokendienst zurückgekehrt und wurde als „Cache“ der nächste Anruf ausgelöst wird ...
Ergebnis in mehreren Aufrufen an das Back-End und Erhalt mehrerer Token.
Kann mir bitte jemand sagen, wie man die mehrfachen Anrufe zum Backend stoppt. Oder wie Sie den Token-Dienst vor allem anderen ausführen und das Ergebnis zwischenspeichern und erst dann zulassen, dass die Anwendung/Dienste/bootstrap ausführen.
Ich bin Winkel Verwendung 2.4.4
Jede Hilfe/Anregung geschätzt
import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import 'rxjs/add/operator/toPromise';
export class Token{
private cachedTokenObject = {
'tokenKey':false,
'userName':"[email protected]",
'password':"1234",
'applicationId':"12344"
};
constructor(private _http: Http){}
getAccessToken():Promise<Object>{
if(this.cachedTokenObject.tokenKey){
console.log("returning chached token");
return Promise.resolve(this.cachedTokenObject);
}else{
console.log("getting new token...");
const tokenHeaders = "username=" + this.cachedTokenObject.userName + "&password=" + this.cachedTokenObject.password +"&grant_type=password";
return this._http.post("https://someurl.com", tokenHeaders)
.toPromise()
.then(result => {
if(result.json().hasOwnProperty('access_token')){
this.cachedTokenObject.tokenKey = result.json()['access_token'];
return this.cachedTokenObject;
}else{
console.log('"access_token" property not found in access object');
return {};
}
})
.catch(error =>{
console.error('*** getAccessToken error ***', error);
Promise.reject(error);
});
}
}
}
import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import 'rxjs/add/operator/toPromise';
import { Headers, RequestOptions } from '@angular/http';
import {AccessTokenService} from './access-token.service';
@Injectable()
export class LanguageService{
private cachedLanguages:any;
constructor(private _http: Http, private _accessTokenService:AccessTokenService){}
getLanguages(){
return this._accessTokenService.getAccessToken().then(token => {
if(this.cachedLanguages){
console.log('returning cached languages', this.cachedLanguages);
return Promise.resolve(this.cachedLanguages);
}else{
let headers = new Headers({ 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token['tokenKey']});
let options = new RequestOptions({ headers: headers });
return this._http.get('https://someUrl/languages', options)
.toPromise()
.then(resp => {
this.cachedLanguages = JSON.parse(resp.json());
return this.cachedLanguages;
})
.catch(error =>{
console.error('*** LanguageService error ***', error);
Promise.reject(error);
});
}
});
}
}
http://stackoverflow.com/questions/36271899/what-ist-the-correct-way-to-share-the-result-of-an-angular-2-http-network-call-in/36291681 # 36291681 –
@ Günter Zöchbauer, danke, dein Beispiel ist sehr klar und einfach zu verstehen – Khaled