2017-05-03 6 views
1

私は少し見たことがありますが、私の問題の解決策を見つけることができませんでした。これはエラー処理で異なるコンテキストを持っています(catchSubscriber)

状況:

私は、サーバーへのすべてのGET-要求を処理し、エラーを処理するデータプロバイダを持っています。エラーが発生すると、Ionic 2のAlertControllerを呼び出すメソッドが呼び出されます。

これは異なるコンテキストを持つため、このメソッドにアクセスできないという問題があります。 GETリクエストを作成するときにはおそらくチェーンと関連があります。

bindはこの問題を解決できるようですが、この状況で実装する方法を理解できません。

export class DataProvider 
{ 
    constructor(public http  : Http, 
       public alertCtrl: AlertController) 
    { 

    } 
    getArticles(): Promise<any> 
    { 
    return this.createHttpRequestGet(this.baseUrl + 'beProduct'); 
    } 

    private createHttpRequestGet(url: string) : Promise<any> 
    { 
    return this.http.get(url, this.getRequestOptions()).map((response) => response.json()).timeout(7500).catch(this.handleError).toPromise(); 
    } 

    private handleError(error:any) 
    { 
    var message = { title: "", text: "" } 

    switch (error.status) 
    { 
     case 401: 
     // Unauthorized 
     message.title = "..." 
     message.text = "... (" + error.status + ").";   
     break; 

    ...  
    }   
    // Can't access variable this 
    this.showErrorAlertText(error.title, error.message); 
    return Promise.reject(message); 
    } 

    showErrorAlertText(title: string, message: string) 
    { 
    this.alertCtrl.create({ 
     title: title, 
     subTitle: message, 
     buttons: ['Ok'] 
    }).present(); 
    } 
} 

これはthis.showErrorAlertText(..,..) enter image description here

+0

が/どのようにこのプロバイダを使用していますか? – echonax

+0

私は実際にtypescriptを使用しないので、私は答えの代わりにコメントします。自己変数の作成を試みて、コンストラクタでそれを割り当ててみましたか? 'var self = this;'?バインドに固執したい場合は、ここに追加してみてください: 'return this.http.get(url、this.getRequestOptions())。bind(this).map(...)。toPromise();' – belyid

答えて

2

オプション1を実行する前に、この値である:

.catch(error => this.handleError(error)) 

オプション2: (あなたは活字体を使用すると仮定)

を3210

オプション3:

.catch(this.handleError.bind(this)) 
+0

ありがとう!オプション1を使用して今すぐ動作します。私は本当になぜそれが急いでいるのか分からない。 – Matt

+0

@Matt Arrow関数(=>)は 'this'の値を保持します。 – zeroflagL

+0

私はcatch(this.handleError)が太い矢印を使うのと同じことをやったと仮定しました。それは自動的にエラーを渡したからです。 – Matt

関連する問題