teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/10/13 11:01

投稿

kuma_kuma_
kuma_kuma_

スコア2506

answer CHANGED
@@ -3,9 +3,18 @@
3
3
  もし動かなくなったのなら、追加した部分を一度コメント化して動作を確認
4
4
  そこから順番にコメント化の範囲を狭めれば大体のエラー箇所は判ります。
5
5
 
6
+ 追記
7
+ 送信を「同期」にするとruby側が応答しないので。
8
+ Javascript側で対応
9
+
6
10
  ```javascript
7
11
  // クリックしたときの処理
12
+ var send_winorlose = false;
13
+ var XHR;
8
14
  function winorlose_click(el){
15
+ if(send_winorlose) return; // 送信中は実行できない
16
+ send_winorlose = true; // 処理中とする
17
+
9
18
  // el にはどこでクリックされたかの情報が入っている
10
19
  var arr = el.target.id.split('_'); // idを'_'で分ける
11
20
  var oppid = arr[0] + '_' + arr[2] + '_'+ arr[1]; // 反対側のid
@@ -49,16 +58,20 @@
49
58
  }
50
59
  }
51
60
 
52
- //※ データの送信は処理の最後(このタイミングなら勝敗数も送れるでしょ)
61
+ //※ データの送信は処理の最後
53
- //あとこの場合constではなくletを使いましょう。
54
- //constはシステム的に定数となるときに使います。グローバル関数で指定しておくなら良いですが
55
- // この関数内で数回指定するのであれば「let」または「var」を使いましょう。
56
- // (環境が揃えられないのこの下の内容で正し動くかは不明)
62
+ // 非同期も結果が返ってるまでクリックを無視するように変更
57
63
  let resultId = el.target.getAttribute("data-id");
64
+ if(!XHR){
58
- let XHR = new XMLHttpRequest();
65
+ XHR = new XMLHttpRequest();
59
- XHR.open("GET", `/results/${resultId}`, false); //※非同期の場合は更新順番が必ず送った順番とならない。
60
- XHR.responseType = "json";
66
+ XHR.responseType = "json";
67
+ XHR.onload = function() {
68
+ send_winorlose = false; // 送信完了
69
+ };
70
+ XHR.onerror = function() {
71
+ send_winorlose = false; // 送信完了
72
+ };
73
+ }
74
+ XHR.open("GET", `/results/${resultId}`, true);
61
75
  XHR.send();
62
76
  }
63
-
64
77
  ```