2016-10-12 4 views
1

ネストされた関数を呼び出すことはできませんかわった。 問題はthis.emitLogedInStatusChange()です。私はエラーメッセージを受け取りました:のsetTimeout()が、私はこのようになりますタイムアウト機能を持って適切に

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

あなたの問題を解決するには、2つの選択肢がありますが、最初のものは(他の返信が示唆される)コンテキストを維持するためにthisにあなたのメソッドの呼び出しを結合することです。

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

第2の解決策は、それを呼び出すときに、変数としてあなたがいない緩いコンテキストを行うこの方法をログアウトを宣言することです:

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

をして、あなたはこのようにそれを呼び出す:

setTimeout(this.logout, 1000); 
関連する問題