- ベストアンサー
[JS]setTimeoutでクラス関数を使いたい
- 特定のクラスの関数を実行する方法がわからない場合、setTimeoutを使用して待機してから実行することが一般的です。
- グローバル変数を使用する場合、setTimeout内で関数を呼び出す方法がありますが、クラス関数を使用する場合には注意が必要です。
- クラス関数を再呼び出す場合は、thisを使用してメソッドを参照することで解決することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
setTimeout関数は setTimeout呼出し後、他の処理に関係なく、指定した時間後に指定した関数を実行する よ 最初のコードが 0 1 2 done になる保証はないわ 何かの原因で console.log(counter); が遅延した場合 0 0 2 done なんていう風になる可能性もあるの それはおいといて setTimeout(this.method,10) で呼び出された2回目のfunction内では、 thisはページ全体を指してしまうので この記述だとif文のthis.counterがundefinedになって doneの方に飛んでしまうわね なので、関数内部ではthisで指定してはいけないわ 次のようにすればOK ・・・なはず(動作確認していないけど) まあ、setTimeoutスレッド問題はむししているけど function test(){ var o = this; o.counter = 0; o.max = 3; o.method = function(){ if ( o.counter < o.max ) { timerId = setTimeout(o.method, 10 ); console.log(this.counter); o.counter++; } else { console.log("done"); } } }
その他の回答 (2)
- fujillin
- ベストアンサー率61% (1594/2576)
#2です。 ちょっと訂正。 if(--n>0) ↓ if(n-->0) にしとかないとwaitが違ってしまうかも。
- fujillin
- ベストアンサー率61% (1594/2576)
methodの呼び出しはすでに回答がありますが、 >擬似的にwaitさせたいだけなので とのことですので、再呼び出しにこんな方法もあるかと… var delay = function(n, func){ (function(){ if(--n>0) setTimeout(arguments.callee, 10); else if(func && typeof func==="function") func(); })(); } delay(300, function(){alert("hoge");}); delay(200, function(){console.log("done200");}); delay(100, function(){console.log("done100");}); // 結果は順に //done100 (console) //done200 (console) //hoge (alert) delay(n, func)の nは繰り返し回数、 funcは経過後のコールバック
お礼
なるほど~。とても参考になりました!! setTimeoutは実際には一定間隔でループさせて 擬似的にwaitさせたいだけなので、 順番の維持とかは影響ないです。 ありがとうございました!!