チェックボックスにチェックがある登録について

いつもお世話になっています。

アプリAにて「保存」時、チェックボックスにチェックがされていればアプリBに登録処理をかける、という処理をしています。その際にチェックが5件ほどの場合は動作が安定しているのですが、チェックが多いと登録が数件抜けていたりと動作が安定しません。現在下記のようにチェックされたらfunctionに飛ばして処理をさせています。どのようにしたら確実に全件処理がされるようになるかご教授いただけないでしょうか?

kanafuki さん

保存時ということはイベントはおそらく submit.success or submit イベントを使用しているかと思います。

このイベント内で非同期処理を実装すると、その結果を待たずにイベントが終了してしまいます。

関数 updata() は非同期処理を行っており、下のように宣言すると、2つある kintone.api() 処理を待たずにイベントが終了してしまいます。

kintone.events.on('app.record.edit.submit'. function(event) {
updata();
});

そこで、こういったイベントでは Promise オブジェクトを使用することにより
非同期処理の結果を待ってからイベント終了するように記述する必要があります。

小難しい話をしましたが、ようは submit や submit.success にイベントハンドラで非同期処理を使用する場合は
Promise オブジェクトを返してあげましょうということになります。

具体的には以下のように書き直すとちゃんと動くかと思います。

1.upData() 関数の戻り値を Promise オブジェクトにする

Post の kintone.api() も 第4引数以降を省略して Promise 化し、return してあげましょう

2.if 文でそれぞれ実行している upData() を最終的に Promise.all で実行するようにする

upData() で返ってくる Promise オブジェクトを適当な変数に格納し、kintone.Promise.all() で実行してあげましょう。
以下のようなイメージです。

var promise1 = upData();
var promise2 = upData();
return kintone.Promise.all([promise1, promise2]) // ちゃんとイベントハンドラにPromiseを返す。

HANSA様

ご返信ありがとうございました。

ご指摘いただいたPromise.allで再度変更をしてみました。

しかし配列には15項目入っているのに、登録は5件や8件しか登録されませんでした。

書き方がまずいでしょうか?ご教授いただけますと幸いです。

(下記追記部分です)

var checkList = new Array();
if(record[‘佐藤’][‘value’] == “佐藤”){
var promise1 = upData(“佐藤”,sagyoTime, processNm, bikouNm, dateVal, companyNm);
checkList.push(‘promise1’);
}

if(record[‘山田’][‘value’] == “山田”){
var promise2 = upData(“山田”,sagyoTime, processNm, bikouNm, dateVal, companyNm);
checkList.push(‘promise2’);
}

console.log(checkList); ←15件入っていました。
return kintone.Promise.all([checkList]).then(function(res) {
alert(“完了”);
}).catch(function(error){
console.error(error);
});

kanafuki さん

> 1.upData() 関数の戻り値を Promise オブジェクトにする
> Post の kintone.api() も 第4引数以降を省略して Promise 化し、return してあげましょう

こちらは対応していただけましたか?

あとは実際にデバッグしていただき、どのようなエラーが出ているか教えて頂けないでしょうか。

 

HANSA様

いつもお世話になっております。

ごめんなさい、試行錯誤しましたが、そもそものPromiseの書き方がわかっていないようで意図した結果になりません。

 

function upData内に
return new Promise(function(resolve,reject){

を入れてみましたが、戻り値になっていないようです。

どのようにしたら戻り値になりますでしょうか?

(POSTの前にもreturnは入れてみましたが。)

hanafuki さん

以前コメントしたとおり、↓のとおりに対応してみてください。

> Post の kintone.api() も 第4引数以降を省略して Promise 化し、return してあげましょう

POST つまりレコードを登録している処理の部分の kintone.api() の第4引数以降を削除してください。
削除した後に その kintone.api() を return してみてください。

今回は new Promise() は必要なさそうです。

 

 

HANSA様

やっとできました!!!

POST自体をreturnするんですね!

勉強させていただきました、本当にありがとうございました!

kanafuki さん

おめでとうございます!

Promise は本当にややこしいのでゆっくり勉強してみてください。

今回の場合だと以下のリファレンスが参考になりそうです。

kintone.api() の第4引数以降を省略すると Promise オブジェクトになる
https://developer.cybozu.io/hc/ja/articles/202166310#step1

Promise をリターンすると非同期処理を待ってからイベントの処理を開始する
https://developer.cybozu.io/hc/ja/articles/202166270#step2

ここらへんも合わせて読むと理解が進むかもしれません。

https://developer.cybozu.io/hc/ja/articles/204564604

HANSA様

リファレンスまでご紹介いただきありがとうございます。

Promise処理は見よう見まねでなんとなく使用しておりましたが、

きちんと理解ができていなかったので、これを機会にしっかり勉強をします。

Promise.allは今後も色んな箇所に使用できそうなので、楽しみです!

ありがとうございました!