レコードの値を取得→計算→保存ボタン押下で表示を変えたい。

初めて質問します。
#スレ違い,情報の過不足ご指摘ください。

あるレコードのテーブルの内容を更新するときに
別のアプリから情報を取得し、値を更新するようにしたいです。

以下のような流れで処理を作成しています。

===

レコード内のテーブルに値(①)を入れる

<保存ボタン押下>

→ 別アプリで①の情報を持つ別の値(②)を取得(kintone.api)
→ ② を仕様に従って計算
→レコードの該当箇所に計算結果(③)代入

保存後、③が該当箇所に表示されている

===

現在console.log()で確認したところ結果の代入は出来ているように見えるのですが
保存後表示がされません。

また、代入された値はブラウザの再読み込みだとログ上では値が残っていて(キャッシュ?)、
別のタブでHTTP Client ToolでGETしてみると③の値は消えています。

チュートリアルの「はじめようkintone API」第8回を参考に作成しましたが
レコードの更新APIを呼ぶ必要などありますでしょうか?

また、もしPUTが必要な場合bodyに変数は使えないのでしょうか?
(やってみたのですが入力エラーになってしまいました。)

何かお気づきの点があればご教授ください。

 

===
※ 抜粋

kintone.events.on([‘app.record.create.submit’,‘app.record.edit.submit’,‘app.record.index.edit.submit’], function (event){

    var body= {
        “app”:xxx,
    };

    // ② 必要な値を取得
    kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, body
    ).then(function(resp) {
        if (resp.records[0] !== null) {

        // レコード内のテーブルを一行ずつ呼び出す
       for(var j = 0; j < table_length; j++){

           var record_length = resp.records.length;

          // j行目のテーブルデータの情報を持つ値を別アプリのデータから探す
          for(var i = 0; i < record_length ; i++){

          //該当データが見つかったら計算

          //テーブルに値を代入
          record_table.value[j].value.ayaya.value = ayaya_value;
          record_table.value[j].value.hoyoyo.value = hoyoyo_value;
          // ★cosole.log() ← ここで確認しました。

      }
    }
}
else{

}
}
).catch(function(){

}
);
return event;
});

===

よろしくお願いします。

tanaka-r さん

kintone.api は、非同期処理ですので API 完了前に、 return event; が実行されてイベント処理が完了しています。

そのため、API 完了後に、event.record を変更しても反映されません。

このような場合は、Promise を使って下記のように記述します。

参考 kintone API で Promise を使ってみよう!

 

kintone.events.on(['app.record.create.submit', 'app.record.edit.submit', 'app.record.index.edit.submit'], function(event) {

var body = {
"app": xxx,
};

// ② 必要な値を取得
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp) {
if (resp.records[0] !== null) {

// レコード内のテーブルを一行ずつ呼び出す
for (var j = 0; j < table_length; j++) {

var record_length = resp.records.length;

// j行目のテーブルデータの情報を持つ値を別アプリのデータから探す
for (var i = 0; i < record_length; i++) {

//該当データが見つかったら計算

//テーブルに値を代入
record_table.value[j].value.ayaya.value = ayaya_value;
record_table.value[j].value.hoyoyo.value = hoyoyo_value;
// ★cosole.log() ← ここで確認しました。

}
}
} else {

}
return event;
}).catch(function() {
event.error = 'レコード取得エラー';
return event;
});
});

rex0220様

コメントありがとうございます。

いただいたURLと記載いただいたソースをもとに実装を修正したところ

想定の動作ができました。!

ありがとうございます。

 

Promise(非同期、同期関連)の勉強不足でした。。

 今回の場合、kintone.events.on()はkintone.api()を待たずに下まで処理を進めて

終わらずにいて、kintone.api()でreturnして、処理が終わるというイメージで合っていますか?

 

余談です。

私が今回間違えたようなkintone.api()より下に何かしらの処理を書いて動作させようとする書き方は

あまりないのでしょうか?基本はapi callの成功時に処理をつらつら書いていくのが無難なのでしょうか。

 

 

 

 

> 今回の場合、kintone.events.on()はkintone.api()を待たずに下まで処理を進めて
>終わらずにいて、kintone.api()でreturnして、処理が終わるというイメージで合っていますか?

はい、その通りです。

参考 URL に下記の記述があります。

・Promiseサポートされたイベントの返り値でPromiseオブジェクトをreturnできる

・リクエスト系 APIでcallbackを省略するとPromiseオブジェクトが返される

この場合、 Promise オブジェクトが 「event」 になります。

>私が今回間違えたようなkintone.api()より下に何かしらの処理を書いて動作させようとする書き方は

>あまりないのでしょうか?基本はapi callの成功時に処理をつらつら書いていくのが無難なのでしょうか。

非同期処理が続く場合は、 then をつなげていくとわかりやすいと思います。

return xxxxx(aaa).then(function(resp) {
return yyyyyy(bbb);
}).then(function(resp) {
return zzzzz(ccc);
}).then(function(resp) {
return event;
});

 

rex0220様

重ねていくつも質問してしまったのですが

ひとつひとつご丁寧に回答していただきありがとうございます。

Promiseの使い方が分かってきました。

thenについても疑問があったのですが、回答で理解が深まりました。

ありがとうございます。