プロセス管理でアクションを実行したときに、他のアプリにデータを登録する処理を行っているのですが、ごくまれにそこで記述されているはずのJavaScriptの処理は一切実行されていないのに、プロセスは次のステップに代わっているときがあります。
⇒app.record.detail.process.proceed イベント
本当にごくまれなのですが、何が原因として考えられるでしょう?
同アプリに登録されいるカスタマイズJSは細かく10以上にファイルが分かれているために、JavaScript のロードがされきっていない等のことがあるのでしょうか?
経験上、よくあることとして…
通信処理の完了まで待機していない
kintone.api()
や REST API Client を使った通信処理は基本的に非同期処理になっていて、適切に await
しないと完了まで待ってくれません。
例えば次のようなコードを書いたとき、
kintone.events.on('app.record.detail.process.proceed', event => {
kintone.api(kintone.api.url('/k/v1/record.json', 'POST', { app: XXX, record: { ... }, });
return event;
});
通信が非同期で行われるため、他アプリへのレコード書き込みが完了する前に return event;
が実行され、プロセス変更が行われます。
この時、他アプリへのレコード書き込みが失敗したとしても、プロセス変更が行われるため、実行していないように見えることがあります。
また、レコード追加のリクエストに問題が無かった (本来なら成功するはずのリクエスト) 場合でも、何らかの理由でレコード追加に時間がかかり、通信が完了する前にプロセス変更が終わり、ブラウザのタブを閉じると通信がキャンセルされることがあります。
ハンドラが多重定義されていて、その中に不届き者のハンドラがいる
ハンドラが多重定義されていると、順番に処理が実行されます。
どこかのハンドラが入力チェック失敗などでイベントの処理を止めようと false
を返したとき、後に実行されるハンドラが return undefined;
などを行うと、 event
の中身がリセットされるので、あたかも正常に処理されたように振舞います。
このあたりの挙動はいろんな方が記事にしているので、探してみるといいかもしれないです。
スマホ版の JS が登録されていない状態で、スマホから操作した
スマホ版の JS が登録されていない場合は、スマホから操作すると何も起こらずプロセス変更されます。
こんなところでしょうか…。
ご回答ありがとうございます。
非同期処理に関しては私も悪い思い出しかないので、そのあたりは気を付けているつもりですが、なお確認してみます。
ハンドラの多重定義に関しても、項目の無効化や項目変更時の処理など実現したい機能ごとにJSが分かれている形になっているので、変なことをやっているものがreturnの部分を確認してみます。
最後のはスマホでなくPCであることは確認とれています。
ただどうしても解せないのが、処理の主の部分はtry~catchでくくっており、どこで処理がおかしくなったか分かるように別アプリにログを出力するようにしているのですが、通常は問題なく正常終了時もエラー終了時もログ出力されているのに、今回に関しては処理開始のログすら出力されていない状態なので、JavaScript のロードがされきっていないのではないかと疑念を持ちました。
//***************************************************************
// プロセス管理実行イベント
//***************************************************************
kintone.events.on(‘app.record.detail.process.proceed’, async(event) => {
let record = event.record;
let chkbox_taisyogai = record.引当対象外.value;
let chkbox_delete = record.削除.value;
let recno = record.レコード番号.value;
let actionNm = event.action.value;
log_tbl = [];
log_nyukinrec = "";
log_jotkbn = "";
nyukin_create_flg = 0;
showSpinner(); // スピナー表示
try {
setLog2("処理開始(" + actionNm + ")",recno);
~~~~~~~~~~中略~~~~~~~~~~~
setLog2("処理終了",recno);
// ログ出力
await window.globalFunction.log_output2(AppId_SyokaiFurikomi,login_user.name,log_tbl);
} catch(err){
//入金取引入力データ生成フラグ初期化
nyukin_create_flg = 0;
event.error = '異常が発生しました。\nエラー内容を確認してください。\n\n・' + err.message;
//ログ出力マスタ2にログを出力
set_nyukinlog_tbl(record.レコード番号.value,log_nyukinrec, log_jotkbn,err.message);
await window.globalFunction.log_output2(AppId_SyokaiFurikomi,login_user.name,log_tbl);
// スピナー非表示
hideSpinner();
}
return event;
「setLog2」はログ出力の内容を生成しているのみで、実際のログ出力はwindow.globalFunction.log_output2という関数を作って処理しています。
mura
4
@wv-sumichan さんのおっしゃるパターンもあるので、他のJSファイルやハンドラはすべて一旦除外することで本当に該当の部分が動作しないかの切り分けはやってもいいかもですね
あと、Devtoolでブレークポイントを貼ってみるとかでもいいかもしれません。
最初の変数定義にすら到達してないのであればやはり不届きハンドラがいそうなきもしますね…
「いいね!」 1
system
(system)
クローズされました:
5
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。