いつもお世話になっています。
アプリAにて「保存」時、チェックボックスにチェックがされていればアプリBに登録処理をかける、という処理をしています。その際にチェックが5件ほどの場合は動作が安定しているのですが、チェックが多いと登録が数件抜けていたりと動作が安定しません。現在下記のようにチェックされたらfunctionに飛ばして処理をさせています。どのようにしたら確実に全件処理がされるようになるかご教授いただけないでしょうか?
いつもお世話になっています。
アプリ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
ここらへんも合わせて読むと理解が進むかもしれません。
HANSA様
リファレンスまでご紹介いただきありがとうございます。
Promise処理は見よう見まねでなんとなく使用しておりましたが、
きちんと理解ができていなかったので、これを機会にしっかり勉強をします。
Promise.allは今後も色んな箇所に使用できそうなので、楽しみです!
ありがとうございました!