2016-05-31 48 views
0

我爲我的Angular2打字稿應用程序創建了一個HttpClient,並且卡在了錯誤處理程序中。如何在擴展Angular2 HTTP Client時運行rxjs Observable之外的方法?

我想發出一個事件,當我遇到401錯誤,並且能夠捕獲錯誤但不觸發我的事件,因爲.catch需要附加到Observable類型的函數,所以我沒有訪問我的HttpClient類這個範圍。

errorHandler (error:any) : Observable<any> { 
 
    if(error.status == 401) { 
 
    // I want to call this.myOtherMethod() here! 
 
    this.events.publish('token_expired'); // Will throw this.events is undefined 
 
    console.log(error); 
 
    } 
 

 
    return Observable.throw(error.json()); 
 
} 
 

 
get(url) : Observable<any> { 
 
    return this.http.get(url, { 
 
    headers: this.customHeaders 
 
    }).catch(this.errorHandler); 
 
}

所以我知道我不能從訪問該功能在我的this.events,但有什麼解決方法嗎?我怎樣才能在那裏注入事件?

回答

1

問題是,您引用errorHandler方法,因此您丟失了this關鍵字的值。這是JavaScript的工作方式。

你可以嘗試以下從這個防止:

get(url) : Observable<any> { 
    return this.http.get(url, { 
    headers: this.customHeaders 
    }).catch((error:any) => { 
    return this.errorHandler(error); 
    }); 
} 

get(url) : Observable<any> { 
    return this.http.get(url, { 
    headers: this.customHeaders 
    }).catch(this.errorHandler.bind(this)); 
} 

您使用bind方法時打字稿需要注意的缺點:

+0

完美的回答!像魅力一樣工作。我太擔心函數類型,我沒有注意到範圍殺戮參考。謝謝! 標記爲已解決。 – gfviegas

相關問題