2017-05-19 3 views
1

Ich lerne Ionic 2. Ich habe einige Daten in ionischen lokalen Speicher gespeichert in einem SomeComponent und retriving das gleiche in Userservice Backend zu rufen, aber storage.get() Methode gibt Versprechen zurück, so kann ich keine Daten daraus bekommen, wie ich über Versprechungen erfahren habe. Kann mir jemand besser helfen, diesen Job zu erledigen? Danke, wenn überhaupt.Local Storage in Ionic 2 nicht in der Lage den Zugang, die außerhalb dann Daten() -Methode

Hier ist mein Code.

export class SomeComponent { 

user: User; 
usename: string; 
password: string; 

    constructor(
    public navParams: NavParams, 
    public navController: NavController, 
    public loginService: LoginSevice, 
    public storage: Storage) { 

    } 

    login() { 
     this.loginService.login(this.username, this.password).subscribe(response => { 
      this.user = response; 
      this.storage.set('userId', this.user.userId); 
      this.storage.set('authcode', this.user.authCode); 
     }); 
     } 
} 

Und der Service ist

export class UserService { 

     userId: string; 
     constructor(public http: Http, public storage: Storage){} 

     fetchUserInfo(): Observable<User> { 

      this.storage.get('userId').then((val) => { 
      console.log(val); // available only inside then() method 
      this.userId = val; 
      }); 

      let user = btoa(this.userId); // userId is undefined 
      return this.http.get(`${this.baseUrl}/user/${user}/details`, {headers: 
       this.headers}) 
      .map(res =>res.json()); 
     } 
     } 
    } 
+3

Mögliches Duplikat [Wie kann ich die Antwort von einem asynchronen Aufruf zurückkehren?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchroner Anruf) – echonax

+0

@echonax Hallo Sir, gibt es eine andere Möglichkeit zum Speichern und Abrufen von Daten aus dem lokalen Speicher in ionischen. –

+0

Ich bin nicht wirklich mit ionischen Erfahrung. Aber die offizielle Dokumentation schlägt vor, das zu verwenden, also denke ich, dass das das Beste sein würde. – echonax

Antwort

2

Eine Möglichkeit, dieses Szenario zu lösen so sein würde:

export class UserService { 

    userId: string; 
    constructor(public http: Http, public storage: Storage){} 

    fetchUserInfo(): Observable<User> { 

     return Observable 
      .fromPromise(this.storage.get('userId')) 
      .flatMap(userId => 
       this.userId = val; 

       let user = btoa(this.userId); 
       return this.http.get(`${this.baseUrl}/user/${user}/details`, {headers: this.headers}) 
          .map(res =>res.json()); 
    } 
} 

Auf diese Weise sind wir zum ersten Mal eine beobachtbare mit dem Versprechen zu schaffen, wird den Wert (userId) aus dem Speicher zurückgeben, und dann verwenden wir die userId wir machen die HTTP-Anfrage (die die Observable<User> zurückgibt). Sie können weitere Informationen über den Operator flatmaphere finden.

0

Ich versuchte mit mergeMAp das funktioniert auch perfekt. Ich kenne nicht den Unterschied zwischen flatMap und mergMap, aber es funktioniert.

export class UserService { 
    userId: string; 
    constructor(public http: Http, public storage: Storage){} 
    fetchUserInfo(): Observable<User> { 
    return Observable 
      .fromPromise(this.storage.get('userId')).mergeMap(userId => 
       this.userId = val; 
       let user = btoa(this.userId); 
       return this.http.get(`${this.baseUrl}/user/${user}/details`, {headers: this.headers}) 
           .map(res =>res.json()); 
    } 
} 
Verwandte Themen