2017-03-03 8 views
0

私のサーバーからの残りのAPIを利用するアプリケーションを開発しようとしているIonicフレームワーク&に慣れています。各APIでは、httpヘッダーにトークンを渡す必要があります。このトークンが有効な場合、私は応答&を返し、リストビューを展開します。トークンが有効でない場合、トークンを生成するために別のAPIをヒットする必要があります&データをフェッチするために最初のAPIを再度ヒットします。イオニックでのHttpリクエスト2

私の問題は後者です。トークンが無効な場合は、&を正常に生成し、最初のAPIを呼び出すこともできますが、今回のリストビューは膨らんでいません。 助けてください。

home.ts

loadPeople(){ 
this.dataService.load() 
.then(data => { 
    this.mylist = data; 
    }); 
} 

データprovider.ts

load() { 
if (this.data) { 
return Promise.resolve(this.data); 
} 

return new Promise(resolve => { 
let headers = new Headers({ 'token': this.token }); 
let options = new RequestOptions({ headers: headers }); 
this.http.get('myurl1', options) 
    .map(res => res.json()) 
    .subscribe(data => { 
    if(data.message === 'TOKEN_NOTVALID'){ 
     this.generateToken(); 
    }else{ 
     this.data = data.result; 
     resolve(this.data); 
    } 
    }); 
}); 
} 

generateAccessToken(){

var creds = "param1=xxx&param2=zzz"; 
var headers = new Headers(); 
headers.append('Content-Type', 'application/x-www-form-urlencoded'); 

this.http.post('myUrlHere', creds, { 
    headers: headers 
    }) 
    .map(res => res.json()) 
    .subscribe(
    data => { 
    this.token = data.token; 
    this.load(); 
    }); 
} 

答えて

1

問題は、トークンが無効である場合、Promiseは決してないことです解決されました。 load関数Promiseへの2番目の呼び出しのみが解決されます。したがって、トークンが有効でない場合はPromiseを解決する必要があります。関数の名前がPromiseresolveであるからといって、ロード関数の2番目の呼び出しがロード関数の最初の呼び出しを解決するわけではありません。

generateAccessTokenにはdata約束を返し、返されたデータで約束を解決することができます。

load() { 
if (this.data) { 
return Promise.resolve(this.data); 
} 

return new Promise(resolve => { 
let headers = new Headers({ 'token': this.token }); 
let options = new RequestOptions({ headers: headers }); 
this.http.get('myurl1', options) 
    .map(res => res.json()) 
    .subscribe(data => { 
    if(data.message === 'TOKEN_NOTVALID'){ 
     this.generateToken().then(data => { resole(data) }); 
    }else{ 
     this.data = data.result; 
     resolve(this.data); 
    } 
    }); 
}); 
} 

generateAccessToken(){ 

var creds = "param1=xxx&param2=zzz"; 
var headers = new Headers(); 
headers.append('Content-Type', 'application/x-www-form-urlencoded'); 

return this.http.post('myUrlHere', creds, { 
    headers: headers 
    }) 
    .map(res => res.json()) 
    .toPromise() 
    .then(
    data => { 
    this.token = data.token; 
    return this.load(); 
    }); 
} 

あなたは、返信用toPromise

import 'rxjs/add/operator/toPromise'; 
+0

感謝をインポートする必要がありますが、「を」type「を無効」 エラーに存在しません与えています。 –

+0

はい、これは動作します。ありがとう:) –

関連する問題