過去のデータを編集中にロード画面を表示させたい

何を実現したいのかを書きましょう

過去の在庫は編集した際に、その日付から現在のデータまで自動で数値を編集するようにしているのですが、後ろで動いているJavaScriptのputが終わるまで画面遷移をさせないようにロード中を表示させたいと思っています。

発生した問題やエラーメッセージを具体的に書きましょう

showSpinnerを使えば、ロード中を表示させれたのですが、PUTが終わる前にshowSpinnerが終わってしまいます。

実行したコードをコピー&ペーストしましょう

(function() {
  'use strict';
  kintone.events.on(['app.record.edit.submit.success','app.record.create.submit.success'], function(event){
    var recodeNo = event.recordId;
    var id = event.appId;
    var rcNo = Number(recodeNo) - 1;
    let putRecords = [];
    var user = kintone.getLoginUser();

    if (user.name === "administrator"){
    showSpinner(); // スピナー表示
    var manager = new KintoneRecordManager;
    manager.getRecords(function(records) {
        // レコード取得後の処理
        for(let i = 0; i < records.length ; i++){
          let rcNo = records[i].レコード番号.value;
              if(rcNo == recodeNo){
                let count = i + 1
                if(count < records.length){
                let honzantainetu = records[i].耐熱カップ_本日残.value;
                let nowrecodeNo = records[count].レコード番号.value;
                const upRecord = {'app': id,'records': [{'id': nowrecodeNo,
                                    'record': {
                                      '耐熱カップ_前日残': {
                                        'value': honzantainetu
                                      }
                                    }
                                  }]
                              }

                RecordUpdate(upRecord);

                for(let j = i; j < records.length; j++){
                  var k = j + 1;
                  let honzantainetu2
                  let honzanumekonbu2
                  if(k < records.length){
                    if(j > i){
                      honzantainetu2 = honzantainetu - Number(records[j].耐熱カップ_総杯数.value) + Number(records[j].耐熱カップ_入庫.value) - Number(records[j].耐熱カップ_廃棄.value);
                      honzantainetu = honzantainetu2;
                    }else{
                      honzantainetu2 = honzantainetu
                      honzantainetu = honzantainetu2;

                    }
                    let uprecodeNo = records[k].レコード番号.value;
                    if(j > i){
                    const tmpRecord = {'id': uprecodeNo,
                                        'record': {
                                          '耐熱カップ_前日残': {
                                            'value': honzantainetu2
                                    }
                                        }
                                  }
                              putRecords.push(tmpRecord);

                          }
                        }
                  }
                  let body = {'app': kintone.app.getId(),'records': putRecords}
                  console.log(body);

                  RecordsUpdate(body);

                }
              }
            }
            });
        }
        
        hideSpinner(); // スピナー非表示
        return event;
});


function RecordUpdate(recodeup){
  kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', recodeup, function(resp) {
    // success
    console.log(resp);
  }, function(error) {
    // error
    console.log(error);
  });
}

      /**
       * kintoneと通信を行うクラス
       */
      var KintoneRecordManager = (function() {
          KintoneRecordManager.prototype.records = [];    // 取得したレコード
          KintoneRecordManager.prototype.appId = null;    // アプリID
          KintoneRecordManager.prototype.query = '';      // 検索クエリ
          KintoneRecordManager.prototype.limit = 100;     // 一回あたりの最大取得件数
          KintoneRecordManager.prototype.offset = 0;      // オフセット

          function KintoneRecordManager() {
              this.appId = kintone.app.getId();
              this.records = [];
          }

          // すべてのレコード取得する
          KintoneRecordManager.prototype.getRecords = function(callback) {
              kintone.api(
                  kintone.api.url('/k/v1/records', true),
                  'GET',
                  {
                      app: this.appId,
                      query: this.query + ('order by 日時 asc '+' limit ' + this.limit + ' offset ' + this.offset)
                  },
                  (function(_this) {
                      return function(res) {
                          var len;
                          Array.prototype.push.apply(_this.records, res.records);
                          len = res.records.length;
                          _this.offset += len;
                          if (len < _this.limit) { // まだレコードがあるか?
                              _this.ready = true;
                              if (callback !== null) {
                                  callback(_this.records); // レコード取得後のcallback
                              }
                          } else {
                              _this.getRecords(callback); // 自分自身をコール
                          }
                      };
                  })(this)
              );
          };
          return KintoneRecordManager;
    })();

// スピナーを動作させる関数
const showSpinner = () => {
  // 要素作成等初期化処理
  if (document.getElementsByClassName('.kintone-spinner').length === 0) {
    // スピナー設置用要素と背景要素の作成
    const spin_div = $('<div id ="kintone-spin" class="kintone-spinner"></div>');
    const spin_bg_div = $('<div id ="kintone-spin-bg" class="kintone-spinner"></div>');

    // スピナー用要素をbodyにappend
    $(document.body).append(spin_div, spin_bg_div);

    // スピナー動作に伴うスタイル設定
    $(spin_div).css({
      'position': 'fixed',
      'top': '50%',
      'left': '50%',
      'z-index': '510',
      'background-color': '#fff',
      'padding': '26px',
      '-moz-border-radius': '4px',
      '-webkit-border-radius': '4px',
      'border-radius': '4px'
    });

    $(spin_bg_div).css({
      'position': 'fixed',
      'top': '0px',
      'left': '0px',
      'z-index': '500',
      'width': '100%',
      'height': '200%',
      'background-color': '#000',
      'opacity': '0.5',
      'filter': 'alpha(opacity=50)',
      '-ms-filter': 'alpha(opacity=50)'
    });

    // スピナーに対するオプション設定
    const opts = {
      'color': '#000'
    };

    // スピナーを作動
    new Spinner(opts).spin(document.getElementById('kintone-spin'));
  }

  // スピナー始動(表示)
  $('.kintone-spinner').show();
};

// スピナーを停止させる関数
const hideSpinner = () => {
  // スピナー停止(非表示)
  $('.kintone-spinner').hide();
};



})();

@kanou さん

REST APIのPUTメソッドは、非同期処理ですので、デフォルトですと処理を待たずにPGが上から順番に流れてしまいます。例として、簡単ですがこのような形になります。
例)
コード1

コード2(非同期処理開始) → コード2処理 → 処理終了

コード3

処理終了

なので、非同期処理を待って処理させたいとasync/awaitなどを使って明示的にする必要があります。
書いてくださってるコードを一部拝借しますと、

//↓async 追加
manager.getRecords(async function(records) {

//~省略~
    //↓await 追加
    await RecordUpdate(upRecord);
//~省略~
})


//↓async 追加
async function RecordUpdate(recodeup){
  //↓await 追加
  await kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', recodeup, function(resp) {
    // success ここは同期処理しなくてもいいのでそのまましてます。
    console.log(resp);
  }, function(error) {
    // error
    console.log(error);
  });
}

このような形になるかなと思います。
PUTが終わるのを待ってからhideSpinner()するようになるはずです。

詳しくは、以下をよかったら参考にしてみてください。

2 Likes

お世話になっております。

ご教授頂いた内容で書いたのですが、やはりSpinnerがPUTより先に終わってしまいます。
具体的にどこをなおせばいいのでしょうか?

(function() {
  'use strict';
  kintone.events.on(['app.record.edit.submit.success','app.record.create.submit.success'], function(event){
    var recodeNo = event.recordId;
    var id = event.appId;
    var rcNo = Number(recodeNo) - 1;
    let putRecords = [];
    var user = kintone.getLoginUser();

    if (user.name === "administrator"){
           // スピナー表示
           showSpinner();
    var manager = new KintoneRecordManager;
    manager.getRecords(async function(records) {

        // レコード取得後の処理
        for(let i = 0; i < records.length ; i++){
          let rcNo = records[i].レコード番号.value;
              if(rcNo == recodeNo){
                let count = i + 1
                if(count < records.length){
                let honzantainetu = records[i].耐熱カップ_本日残.value;
                let nowrecodeNo = records[count].レコード番号.value;
                const upRecord = {'app': id,'records': [{'id': nowrecodeNo,
                                    'record': {
                                      '耐熱カップ_前日残': {
                                        'value': honzantainetu
                                      }
                                    }
                                  }]
                              }

                await RecordUpdate(upRecord);

                for(let j = i; j < records.length; j++){
                  var k = j + 1;
                  let honzantainetu2
                  if(k < records.length){
                    if(j > i){
                      honzantainetu2 = honzantainetu - Number(records[j].耐熱カップ_総杯数.value) + Number(records[j].耐熱カップ_入庫.value) - Number(records[j].耐熱カップ_廃棄.value);
                      honzantainetu = honzantainetu2;
                    }else{
                      honzantainetu2 = honzantainetu
                      honzantainetu = honzantainetu2;

                    }

                   let uprecodeNo = records[k].レコード番号.value;
                    if(j > i){
                    const tmpRecord = {'id': uprecodeNo,
                                        'record': {
                                          '耐熱カップ_前日残': {

                                          }
                                        }
                                  }
                              putRecords.push(tmpRecord);

                          }
                        }
                  }
                  let body = {'app': kintone.app.getId(),'records': putRecords}

                  await RecordUpdate(body);

                }
              }
            }
             
            });
            hideSpinner(); // スピナー非表示
        }
        
        
});


async function RecordUpdate(recodeup){
  await kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', recodeup, function(resp) {
    // success
    console.log(resp);
  }, function(error) {
    // error
    console.log(error);
  });
}


@kanou さん

kintoneRecordManager()は非同期処理なのかどうかわかりませんが、
kintoneRecordManager()とhideSpinner()は同じスコープ内にいて、kintoneRecordManager()内で非同期処理があるためそちら待たずにhideSpinner()が作動しちゃうのでしょうね。(わかりにくくてすみません…)
恐らく下記参考にしていただいて、このように書いていただいたらいけるかなと思ってます。

(function () {
  'use strict';

  //↓こちらにasync 追加
  kintone.events.on(['app.record.edit.submit.success', 'app.record.create.submit.success'], async function (event) {
    const recodeNo = event.recordId;
    const id = event.appId;
    const rcNo = Number(recodeNo) - 1;
    let putRecords = [];
    const user = kintone.getLoginUser();

    if (user.name === "administrator") {
      // スピナー表示
      showSpinner();
      const manager = new KintoneRecordManager;

      //↓こちらにawait追加
      await manager.getRecords(async function (records) {

        //~以下略~

      });
      hideSpinner(); // スピナー非表示
    }
  });
})();

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。