他アプリのサブテーブルへの更新処理について

お世話になります。

入力されたサブテーブルの値から他アプリのサブテーブルを参照し、

該当する項目が一致する場合は対象行の更新、

一致しなければ新規行として更新を掛ける様にしています。

しかし①のループ処理が長すぎる為、

イベントが先に終わってしまうのか途中で更新処理が終わってしまう状態です。

setTimeoutを挟んでみたのですが、

レコード更新後のイベントではうまくいくのですが、

レコード追加後のイベントではsetTimeoutが通らず、やはり途中で更新処理が終わってしまいます。

拙い説明で解り辛いかもしれませんが、

解決方法が有りましたら、ご教示頂ければ助かります。

宜しくお願い致します。

kintone.events.on(['app.record.create.submit.success','app.record.edit.submit.success'], function(event){
 //サブテーブルの値からparams作り
 returnnew kintone.Promise(function(resolve, reject) {
  kintone.api('/k/v1/records', 'GET', params, function(resp) {
   resolve(resp);
   });
  }).then(function(resp) {
   //①ループによる他アプリへの更新用objの生成
   //②setTimeout
//③一致する他アプリのレコードに対する更新処理
   //④一致するレコードがない場合は他アプリへ新規追加
  }).then(function(){
   console.log("END");
   return event;
  });
});

 

IR0000さん

多分、③、④のあたりで正しくPromiseの制御ができていないのが問題かと思います。

then()の中でのコードを見てみないとなんともですが、例えばkintone.api()はreturnしていないと非同期のコールバック(PromiseObject)を待ち合わせしません。

 

以下のようなコードで実現できると思いますので試してみてください。

(function() {
 "use strict";
 kintone.events.on(['app.record.create.submit.success','app.record.edit.submit.success'], function(event){

   **return** kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
   var records = [];
   //①ループによる他アプリへの更新用objの生成
   for (var i in resp.records) {
    records.push({'post/put するレコード'});
   }
   var params = {
    app: 12345,
    records:records
   };

   if ('post/put の分岐') { //PUT
    //③一致する他アプリのレコードに対する更新処理
     **return** kintone.api('/k/v1/records', 'PUT', params).then(function(resp) {
     console.log('put record success');
    });
   } else { // POST
    //④一致するレコードがない場合は他アプリへ新規追加
     **return** kintone.api('/k/v1/records', 'POST', params).then(function(resp) {
     console.log('post record success');
    });
   }

  }).then(function(){
   console.log("END");
   return event;
  });
 });
})();

 

あと、こちらのようなupsertするライブラリがあるので試してみてはどうでしょうか。こちらを使えば、①の処理とupsertの関数だけで実現できそうです。

http://qiita.com/kiku38/items/f903fcdf0c4e3d6ac1ab#upsertRecords