回答編集履歴

2

コメント修正

2021/01/10 11:52

投稿

umau
umau

スコア831

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  // イベント関数は終了します。その時点で、イベント関数内で定義された変数は消えてしまうため、
26
26
 
27
- // tmは外のグローバルな位置に定義しておきます。10秒後起動する関数が見るためです。
27
+ // tmは外のグローバルな位置に定義しておきます。cancel呼び出し時に見るためです。
28
28
 
29
29
  let tm;
30
30
 

1

内容を簡略化

2021/01/10 11:52

投稿

umau
umau

スコア831

test CHANGED
@@ -1,12 +1,10 @@
1
1
  中にざっくり説明書きました。
2
+
3
+ (1/10 19:47 編集) 簡単な内容に書き換えました
2
4
 
3
5
 
4
6
 
5
7
  ※javascriptの変数のライフサイクル、スコープについて勉強する場合、クロージャというキーワードで検索して勉強してみてください。
6
-
7
-
8
-
9
- ※setTimeoutのところを、setIntervalに変えると、10秒ごとに繰り返し呼び出され、キャンセルされるまで続く、という動きになります。やりたい事はこっちじゃないですかね。
10
8
 
11
9
 
12
10
 
@@ -20,21 +18,15 @@
20
18
 
21
19
 
22
20
 
23
- // ↓のcancelFlg message => { ... }(以下、イベント関数) の外にある事が重要。
21
+ // ↓のtmが 「client.on('message', message => { ... });」の外にある事が重要。
24
22
 
25
- // setTimeoutしている部分は、pechakucya関数を10秒後に実行するように設定して、そのまま先に進み、
23
+ // setTimeoutしている部分は、内部関数を10秒後に実行するように設定して、そのまま先に進み、
26
24
 
27
25
  // イベント関数は終了します。その時点で、イベント関数内で定義された変数は消えてしまうため、
28
26
 
29
- // cancelFlgは外のグローバルな位置に定義しておきます。10秒後に起動するpechakucya関数が見るためです。
27
+ // tmは外のグローバルな位置に定義しておきます。10秒後に起動する関数が見るためです。
30
28
 
31
- // 10秒経つ前にcancelメッセージを飛ばすと、cancelFlgがtrueになり、
32
-
33
- // pechakucyaが実行された時に「やめ」になります。
34
-
35
- let cancelFlg = false
29
+ let tm;
36
-
37
-
38
30
 
39
31
  client.on('message', message => {
40
32
 
@@ -46,45 +38,19 @@
46
38
 
47
39
 
48
40
 
49
- let tm;
50
-
51
41
  if (message.content === 'start') {
52
42
 
53
-
54
-
55
- // tm はイベント関数内に定義されていますが、pechakucha関数の中で使われているため、
56
-
57
- // イベント関数終了時に消されず、pechakucyaが参照を持ち続けることになります。
58
-
59
- // (詳しくはJavascriptのクロージャについて勉強してください)
60
-
61
- tm = setTimeout(function pechakucya(){
43
+ tm = setTimeout(function(){
62
-
63
- if (cancelFlg) {
64
-
65
- clearTimeout(tm)
66
-
67
- message.channel.send('やめ')
68
-
69
- return
70
-
71
- }
72
44
 
73
45
  message.channel.send('10秒経ったよ')
74
-
75
-
76
46
 
77
47
  }, 10000)
78
48
 
79
49
  } else if (message.content === 'cancel') {
80
50
 
81
- // cancelはsetTimeoutの中で行います。
51
+ clearTimeout(tm)
82
52
 
83
- // ここでclearTimeoutを呼んでも、setTimeout時に設定したtmは残っていないため、
84
-
85
- // 止られません。
53
+ message.channel.send('や')
86
-
87
- cancelFlg = true
88
54
 
89
55
  }
90
56