2016-10-12 70 views
1

我有一個超時功能,看起來像這樣:的setTimeout()不能調用嵌套函數正確

setTimeout(this.logout, 1000); 

登錄方法:

logout() { 
    this.auth_token = ""; 
    this.loggedIn = false; 
    this.emitLogedInStatusChange(); 
    } 

isLoggedIn() { 
    return this.loggedIn; 
    } 

    private emitLogedInStatusChange() { 
     this.LoggedInStatusChangedEmitter.emit({value: this.loggedIn}); 
    } 

其中事件發射器告訴主部件,其中用於的loggedIn的值是改變。 問題是this.emitLogedInStatusChange();我得到了一個錯誤信息:

this.emitLogedInStatusChange is not a function 

我的問題是如何正確調用這個函數在註銷,所以setTimeout可以工作?

這裏就是我稱之爲:

map((res) => { 
if (res.username === username) { 
    this.auth_token = res.access_token; 
    this.sessionId = res.SessionID; 
    this.loggedIn = true; 
    this.expires = res.expires_in; 
    setTimeout(this.logout, this.expires*1000); 
    this.emitLogedInStatusChange(); 
    } 
+0

你的超時被調用了嗎? –

回答

3

當傳遞函數和方法而言,總是要如何影響的this範圍照顧。默認情況下,JS使用調用者的範圍。

有一些方法可以顯式地指定的範圍內使用。

setTimeout(this.logout.bind(this), 1000); 

,但我不能肯定,因爲你的代碼不顯示在代碼是從調用。

或者

setTimeout(() => this.logout(), 1000); 

可以使用,但似乎不太簡潔。對於參數傳遞給回調函數的其他用例,它們需要重複,如

someFunction((a, b, c) => this.logout(a, b, c), 1000); 
+0

它是登錄方法在角2登錄 –

+1

請編輯您的問題,並在那裏添加代碼。評論中的代碼是不可讀的。我想知道的是調用代碼與被調用代碼的關係(相同的類,其他類,其他類如何獲得對該函數的引用) –

+1

謝謝!這工作! :) –

0

您正在將函數傳遞給setTimeout()。

我會建議使用匿名函數,該函數調用所需的功能,而不是:

setTimeout(function(){ 
    this.logout(); 
}, 1000); 
2

setTimeout將函數調用添加到事件循環,並從那裏啓動它。 因此this丟失並設置爲window(默認值)。您必須將this綁定到您的功能。

setTimeout(this.logout.bind(this), 1000); 
2

有兩個備選方案,以解決您的問題,第一個(如對方回覆建議)是你的方法調用this結合,以保持環境。

setTimeout(this.logout.bind(this), 1000); 

第二種解決方案是在調用它宣佈退出作爲變量,這樣,你不要鬆背景:

logout =() => { 
    this.auth_token = ""; 
    this.loggedIn = false; 
    this.emitLogedInStatusChange(); 
} 

然後調用這樣說:

setTimeout(this.logout, 1000);