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

回答編集履歴

1

補足

2018/12/17 13:16

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -2,20 +2,21 @@
2
2
 
3
3
  * arrSendDataがundefined
4
4
  これはもともと`GetAllControlValue`が何もしてないからです。
5
- 返り値を作って返さないと(もしくはグローバルなarrSendDataにpushしていってもいいですが);
5
+ 返り値を作って返さないと(もしくはグローバルなarrSendDataにpushしていってもいいですが)、arrSendDataが自動で埋まってくれたりはしません。
6
6
  ```javascript
7
7
  // JavaScript内サブルーチン
8
8
  // HTMLのコントロールの値を配列に格納
9
- function GetAllControlValue(TXT_ID) //グローバルなTXT_IDをもらって嬉しいのか微妙
9
+ function GetAllControlValue(TXT_ID)
10
10
  {
11
11
  var i = 0;
12
12
  var ret = [];
13
13
  for(i = 0; i < TXT_ID.length;i++)
14
14
  {
15
15
  // ここセンスない。Valueがnullならと書き換えたい。
16
- if(document.getElementById(TXT_ID[i]).value == "")
16
+ // if(document.getElementById(TXT_ID[i]).value == "")
17
+ if(document.getElementById(TXT_ID[i]).value) //またはif(document.getElementById(TXT_ID[i]).value === "")
17
18
  {
18
- OutputErrorMessage(ERR_CODE.CONTROL_EMPTY); // このエラーの出し方では何の項目がエラーか分かりません。またbreakするとか、エラーだったら送信できないとか手当が必要と思われる
19
+ OutputErrorMessage(ERR_CODE.CONTROL_EMPTY); // このエラーの出し方では何の項目がエラーか分かりません。またbreakするとか、エラーだったら送信できないとか手当が必要と思います
19
20
  }
20
21
  ret.push(document.getElementById(TXT_ID[i]).value); //これをelseとかに入れると項目の数があわなくなるので、EmptyStringでも格納する必要がある
21
22
  }
@@ -30,4 +31,5 @@
30
31
  「できない」というのがネガティブな捉えかただとすれば、用途が違うので認識を改めていただく必要があります。
31
32
  新設したグローバルなフラグが何につかわれるか分かりませんが、非同期というのをもう一度冷静に見直してください。
32
33
  google.runで非同期にコールされた関数はいつ戻ってくるか保証がありません。その間btnAddSession_Clickはどんどん、次の行、次の行と処理を進めていきます。したがってフラグが埋まるころには、フラグを利用して止まるはずの処理が走り終わっています(google.runは非常に遅いため)。
33
- そうではなくて`CallGas_AccountCheck`のelse(retがfalseでないとき)で、次のgoogle.runをなげてシナリオチェックをし、そのコールバックである`CallGas_SenarioNameCheck`のelse(retがfalseでないとき)に、AddSessionを実行する、というように、非同期のコールバックが次の非同期のコールバックを呼ぶように関数を連鎖させるように組んでいく必要があります(カードゲームで例えると、呪文をスタックに積んで順次解決する感じですかね)。
34
+ そうではなくて`CallGas_AccountCheck`のelse(retがfalseでないとき)で、次のgoogle.runをなげてシナリオチェックをし、そのコールバックである`CallGas_SenarioNameCheck`のelse(retがfalseでないとき)に、AddSessionを実行する、というように、非同期のコールバックが次の非同期のコールバックを呼ぶように関数を連鎖させるように組んでいく必要があります(カードゲームで例えると、呪文をスタックに積んで順次解決する感じですかね)。
35
+ (補足)コールバックの連鎖って書きましたが、たぶんUXはすごく悪いので(google.runは遅い)、必要な引数は全部まとめてgasになげて、サーバからの戻りは1回のほうが、ユーザの待ちは短くてすむと思う(返り値を{IsSuccess:true/false, ErrorMessages:"Error.Code.Something", Result:""}みたいな形式で返す。