create.submit時のレコード一括操作の同期処理について

OKAと申します。

ユーザー毎にレコードを一括削除した後、レコードを一括登録する処理を行いたいのですが、create.submit時に完全に処理が終わる前に画面が更新されてしまいます。

下記のように記述しているのですが、不備な点がありましたらご指摘いただけますと幸いです。

よろしくお願いいたします。

array_ids.lengthには削除したいレコードのIDをユーザー毎に配列に格納しています。

array_ids.length = [{1 ,2 ,3}, {4 ,5 ,6 }, {7 ,8 ,9 }, {10 ,11 ,12 }]のようなイメージです。

 

return new kintone.Promise(function(resolve, reject) {

  if(array_ids.length == 0) {
    resolve(event);
  } else {
    new kintone.Promise(function(resolve1, reject1) {
      function loop(l) {
        return new kintone.Promise(function(resolve2, reject2) {

          var param = {
            ‘app’: APP_NO, // アプリID
            ‘ids’: array_ids[l] // レコードID
          };

          kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘DELETE’, param, function(resp) {
            // success
            resolve2(l + 1);
          }, function(error) {
            // error
            resolve2(l + 1);
          });

        }).then(function(count) {

          // ループを抜けるかどうかの判定
          if(count == array_ids.length) {
            // 抜ける(外側のPromiseのresolve判定を実行
            resolve1();
          } else {
            // 再帰的に実行
            loop(count);
          }
        });
      }
      // 初回実行
      loop(0);

    }).then(function() {
      // ループ処理が終わったらここにくる
      console.log(‘delete finish’);
      resolve(event);
    });
  }

}).then(function(resp) {

  var array_records = new Array();

  for(var i = 0; i < record[‘氏名’][‘value’].length; i++) {

    var array_record = new Array();
    var vUser = record[‘氏名’][‘value’][i][‘code’];

    // 新規の非稼働日報レコード作成
    for(var k = 0; k < vDates.length; k++) {
      // 日報作成パラメータ設定
      var arr = { } // 省略
      array_record.push(arr);
    }
    array_records.push(array_record);
  }

  new kintone.Promise(function(resolve1, reject1) {
    function loop(l) {
      return new kintone.Promise(function(resolve2, reject2) {

        var param = {
          “app”: APP_NO,
          “records”: array_records[l]
        };

        // kintone REST API(POST)
        kintone.api(
          kintone.api.url(‘/k/v1/records’, true), // - pathOrUrl
          ‘POST’, // - method
          param, // - params
          function(resp) { // - callback
            resolve2(l + 1);
          },
          function(error) { // - errback
           resolve2(l + 1);
          }
        );

      }).then(function(count) {

        // ループを抜けるかどうかの判定
        if(count == array_records.length) {
          // 抜ける(外側のPromiseのresolve判定を実行
          resolve1();
        } else {
          // 再帰的に実行
          loop(count);
        }
      });
    }
    // 初回実行
    loop(0);

  }).then(function() {

    // ループ処理が終わったらここにくる
    console.log(‘create finish’);
    resolve(event);
  });
}).then(function(resp) {
  alert(‘処理が終了しました’);
});

OKA さん

下記の resolve で、promise が完了しますので、イベント処理は完了し、画面遷移します。
なお、promise 処理しか記述がありませんが、よくあるミスとして promise 処理の後続で「return event;」が記述されたりしていると
やはり、イベント処理は完了してしまいます。

また、件数によりますが、削除や追加はまとめて1回のAPIで処理できそうな気がします。
100件以上ある場合は、「kintone Utility for JavaScript」を使われてはいかがでしょうか?
コード上の再帰処理がなくなりますので、見通しが良くなります。

if(array_ids.length == 0) {
resolve(event);

 

// ループ処理が終わったらここにくる
console.log(‘delete finish’);
resolve(event);

rex0220様

ご教示いただきありがとうございます。

「kintone Utility for JavaScript」を利用し、望み通りの動作を実装できました。

今後も活用したいと思います。