2017-03-03 87 views
0

我是新來Ionic框架&去開發一個應用程序,它利用從我的服務器休息API。在每個API中,我必須在http頭中傳遞一個令牌。如果此令牌有效,則返回響應&膨脹該列表視圖。如果令牌無效,那麼我必須擊中另一個API才能生成令牌&,再次命中第一個API以獲取數據。Http請求離子2

我的問題是第二種情況。當令牌無效時,它被成功生成&然後調用第一個API也是成功的,但這次的listview沒有被誇大。 請幫忙。

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已解決。因此,當令牌無效時,您需要解決Promise。僅僅因爲該函數的名稱是resolvePromise中,並不意味着第二次調用加載函數將解析第一次調用加載函數。

您可以返回data承諾generateAccessToken然後用返回的數據解決承諾。

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

感謝答覆,但它給「然後」不會對類型「無效」 錯誤存在。 –

+0

是的,這有效。謝謝 :) –