回答編集履歴

1

追記

2020/10/13 11:01

投稿

kuma_kuma_
kuma_kuma_

スコア2506

test CHANGED
@@ -8,11 +8,29 @@
8
8
 
9
9
 
10
10
 
11
+ 追記
12
+
13
+ 送信を「同期」にするとruby側が応答しないので。
14
+
15
+ Javascript側で対応
16
+
17
+
18
+
11
19
  ```javascript
12
20
 
13
21
  // クリックしたときの処理
14
22
 
23
+ var send_winorlose = false;
24
+
25
+ var XHR;
26
+
15
27
  function winorlose_click(el){
28
+
29
+ if(send_winorlose) return; // 送信中は実行できない
30
+
31
+ send_winorlose = true; // 処理中とする
32
+
33
+
16
34
 
17
35
  // el にはどこでクリックされたかの情報が入っている
18
36
 
@@ -100,28 +118,36 @@
100
118
 
101
119
 
102
120
 
103
- //※ データの送信は処理の最後(このタイミングなら勝敗数も送れるでしょ)
121
+ //※ データの送信は処理の最後
104
122
 
105
- //あとこの場合constではなくletを使いましょう。
106
-
107
- //constはシステム的に定数となるときに使います。グローバル関数で指定しておくなら良いですが
108
-
109
- // この関数内で数回指定するのであれば「let」または「var」を使いましょう。
110
-
111
- // (環境揃えられないのこの下の内容で正しく動くかは不明)
123
+ // 非同期でも結果返ってくるまクリックを無視するように変更
112
124
 
113
125
  let resultId = el.target.getAttribute("data-id");
114
126
 
115
- let XHR = new XMLHttpRequest();
127
+ if(!XHR){
116
128
 
117
- XHR.open("GET", `/results/${resultId}`, false); //※非同期の場合は更新順番が必ず送った順番とならない。
129
+ XHR = new XMLHttpRequest();
118
130
 
119
- XHR.responseType = "json";
131
+ XHR.responseType = "json";
132
+
133
+ XHR.onload = function() {
134
+
135
+ send_winorlose = false; // 送信完了
136
+
137
+ };
138
+
139
+ XHR.onerror = function() {
140
+
141
+ send_winorlose = false; // 送信完了
142
+
143
+ };
144
+
145
+ }
146
+
147
+ XHR.open("GET", `/results/${resultId}`, true);
120
148
 
121
149
  XHR.send();
122
150
 
123
151
  }
124
152
 
125
-
126
-
127
153
  ```