同期非同期の対応は必要?

以下のソースコードを実行した時にカウンター「i」の動きがおかしいのですが、

同期非同期の対応は必要でしょうか?

jQuery.noConflict();
(function($) {
“use strict”;
kintone.events.on(“app.record.index.show”, function(event) {

//色の設定値
var fontColorRed = “#ff0000”;
//

//
var elName1 = kintone.app.getFieldElements(‘name1’);
var elName2 = kintone.app.getFieldElements(‘name2’);
var elName3 = kintone.app.getFieldElements(‘name3’);
var elId = kintone.app.getFieldElements(‘変更Id’);
var elMakeDate = kintone.app.getFieldElements(‘makeDate’);
var appId = kintone.app.getId();

// 一覧画面のレコードの数分
for (var i = 0; i < elMakeDate.length; i++) {

console.log('elMakeDate.length: '+elMakeDate.length);

//レコード情報を取得
var record = event.records[i];
var recId = record.$id.value;

//

var body = {
“app”: 91,
“query”: ‘変更appId = ’ + appId+’ and ’ +'変更recordId = ’ +recId};

console.log(‘body:’+body.query);
kintone.api(‘/k/v1/records’, ‘GET’, body, function(resp) {

if (resp[‘records’].length > 0) {
for (var j = 0; j < resp[‘records’].length; j++) {
var frecord = resp.records[j];

if (frecord.変更fieldCd.value == ‘name1’) {
elName1[i].style.backgroundColor = fontColorRed;
}
if (frecord.変更fieldCd.value == ‘name2’) {
elName2[i].style.backgroundColor = fontColorRed;
}
if (frecord.変更fieldCd.value == ‘name3’) {
elName3[i].style.backgroundColor = fontColorRed;
}

}
}
},function(error){

console.log(error);
});
}

});
})(jQuery);

必要な場合の対応もご教授お願い致します。

松本さん

非同期の対応が必要になります。
上記のループ処理は、APIの完了を待たずに進んでしまいます。
結果的にAPI完了時は、i=elMakeDate の値になっていると思います。

対象アプリの構成や対象レコード数などにより対応案が異なると思います。
読込対象レコードがそれほど多くない場合は、下記のような処理手順でいかがでしょうか?

1.対象レコード一括取得
取得対象のレコード数が500件以上の場合は、全件取得する処理が必要になります。

event の全レコード番号を変数にセット。 例 recNo : ‘100,101,102,…’

“query”: ‘変更appId = ’ + appId + ’ and 変更fieldCd in (“name1”,“name2”,“name3”) and 変更recordId in (’ + recNo + ‘) limit 500’

※背景色処理対象となるレコードのみ取得
全件対象の場合は、「変更fieldCd in (“name1”,“name2”,“name3”) 」は不要

“fields”: [“変更recordId”, “変更fieldCd”]
取得する項目は、必要なものだけにしたほうがパフォーマンス改善になります。

2.レコード取得後に、背景色処理

変更recordId をキーに、対象行位置を取得して、背景色処理

 

もし、読込対象レコードがかなり多い場合(数万件以上)は、元アプリに関連レコードを設定して
元アプリを条件抽出(関連レコードに"name1"があるか)して処理するなどが考えられます。
この処理だと対象レコードが多くても3回(“name1”,“name2”,“name3”)のAPIで済みます。

rex0220様

ご教授ありがとうございます。

同期非同期の対応は経験したことがなく、自分で判断できませんでしたので、

明快な説明を頂いたのでスッキリしました。

早速、この方法で修正してみます。(対象レコードは多くない方になります)