2016-10-03 3 views
0

Я использую ionic 2/угловой 2.Как вернуть запрос внутри обещания

Мне нужно сделать http-запрос, но прежде чем я получу токен, используя Ionic Storage.

Я создал класс ApiRequest для этого

import {Http, Headers, RequestOptions} from '@angular/http'; 
import {Injectable} from '@angular/core'; 
import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import { Storage } from '@ionic/storage'; 

@Injectable() 
export class ApiRequest { 

    access_token: string; 

    constructor(private http: Http, public storage: Storage) { 
     this.storage.get('access_token').then((value:any) => { 
      this.access_token = value; 
     }); 
    } 

    get(url) { 
     let headers = new Headers({ 
      // 'Content-Type': 'application/json', 
      'Authorization': 'Bearer ' + this.access_token, 
      'X-Requested-With': 'XMLHttpRequest' 
     }); 
     let options = new RequestOptions({ headers: headers }); 

     return this.http.get(url, options) 
      .map(res => res.json()); 

    } 

} 

Тогда я могу назвать как то

apiRequest.get(this.URL) 
     .subscribe(
      data => { 
       this.element= data; 
      }, 
      err => { 
       console.log(JSON.stringify(err)); 
      }); 

Моя проблема, this.storage.get является асинхронным, http.get является асинхронным тоже, и я должны возвращать http.get, потому что я хочу позвонить subscribe вне функции.

В этом случае http.get вызывается до того, как токен this.acess получил значение.

Как я могу организовать свой код в этом сценарии?

+0

Это может помочь ~ http://stackoverflow.com/questions/35498456/what-is-httpinterceptor-equivalent-in- angular2 – Phil

ответ

2

Это может сработать (не пробовал себя):

@Injectable() 
export class ApiRequest { 

    access_token: string; 

    constructor(private http: Http, public storage: Storage) { 
     this.storagePromise = this.storage.get('access_token').then((value:any) => { 
      this.access_token = value; 
     }); 
    } 

    get(url) { 
     let headers = new Headers({ 
      // 'Content-Type': 'application/json', 
      'Authorization': 'Bearer ' + this.access_token, 
      'X-Requested-With': 'XMLHttpRequest' 
     }); 
     let options = new RequestOptions({ headers: headers }); 

     return this.storagePromise.then(
      return token => this.http.get(url, options) 
      .map(res => res.json()); 
     ); 
    } 
} 
apiRequest.get(this.URL) 
    .then(observable => 
     observable.subscribe(
     data => { 
      this.element= data; 
     }, 
     err => { 
      console.log(JSON.stringify(err)); 
     } 
    );