changeイベント async/awaitを使用しないで処理を待つ方法はあるのでしょうか?

現在、ユーザーコードをキーに、所属組織を取得しています。

下記のコードだと、取得する前に、処理が走ってしまします。

changeイベントで、async/awaitを使用しないで処理を待つ方法はあるのでしょうか?

(() => {

    ‘use strict’;

    // kintone.events.on(‘app.record.create.change.支店担当組織_担当者’, event => {

    //  const record = event.record;

    //  console.log(‘サブテーブルの行が追加または削除された。’);

    //  return event;

    // });

    kintone.events.on([‘app.record.create.change.担当者’, ‘app.record.edit.change.担当者’], event => {

        let record = event.record;

        let body = record.支店担当組織_担当者.value;

        let allvalue = [];

        let body02 = [];

        console.log(“サブテーブル全ての値”, body);

        if (record.支店担当組織_担当者.value) {

            allvalue = [];

            for (let i = 0; i < record.支店担当組織_担当者.value.length; i++) {

                allvalue[i] = record.支店担当組織_担当者.value[i].value.担当者.value[0].code

                // body02[i] = allvalue[i].code

                body02[i] = {

                    “code”: allvalue[i]

                };

            }

        };

        let sosikicode = [];

        let code = [];

        let name = [];

        console.log(“サブテーブル内の担当者”, allvalue);

        if (body02) {

            for (let i = 0; i < allvalue.length; i++) {

                kintone.api(kintone.api.url(‘/v1/user/organizations’, true), ‘GET’, body02[i], function (resp) {

                    sosikicode[i] = resp

                    console.log(sosikicode)

                    code[i] = sosikicode[i].organizationTitles[0].organization.code;

                    name[i] = sosikicode[i].organizationTitles[0].organization.name;

                })

            }

           

            console.log(“コードと組織名”, code, name);

            let NameCode = [];

            let body03 = [];

            for (let i = 0; i < code.length; i++) {

                NameCode[i] = {

                    “code”: code[i],

                    “name”: name[i]

                }

                console.log(“name,code”,NameCode)

                body03 = {

                    value: {

                        “担当者”: {

                            type: “USER_SELECT”,

                            value: user

                        },

                        “担当組織”: {

                            type: “ORGANIZATION_SELECT”,

                            value: [NameCode[i]]

                        }

                    }

                }

            }

        }

async/await つかうなら、こちらの記事が参考になると思います。
https://qiita.com/t_numata/items/bc6f302fc2664b47385f

sakamoto さん  らいとさん こんにちは

async/await を使わない場合でしたら kintone.app.record.get() と kintone.app.record.set() を使う手段があると思いました。

・kintone.api で取得した値を使用した処理(テーブルに値をセットする処理)を別の関数で定義する

・その関数の中で、kintone.app.record.get() と kintone.app.record.set() を用いる

・apiのcallback関数の中で関数を呼び出す

といった感じでしょうか。

サンプルを作ってみました。参考になれば幸いです。

(function() {
  'use strict';
  const event = ['app.record.create.change.担当者', 'app.record.edit.change.担当者'];
  
  function setTable(org){
    // レコードを呼び出すメソッド
    const record = kintone.app.record.get();
    // その中でテーブルを取り出す
    const _table = record.record.Table.value;
    // 行でまわして
    _table.map((row) => {
      // 担当者の値が、引数で渡ってきたユーザに存在する場合
      row.value.担当者.value.forEach((user) => {
        if(user.code in org){
          const dept = org[user.code];
          // そのユーザの担当組織をセットする
          row.value.担当組織.value.push(dept);
        }
      });
    });
    // レコードに値をセットするメソッド
    kintone.app.record.set(record);
  }
  
  kintone.events.on(event, function(e) {
    // 変更したユーザ情報を配列で取得する
    const users = e.changes.field.value;
    // ユーザをforEachでまわす
    users.forEach((user, i) => {
    kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', user, function (resp) {
        const org = {};
        // org[user.code]で組織情報を呼び出せるようにする
      org[user.code] = {
        code: resp.organizationTitles[0].organization.code,
        name: resp.organizationTitles[0].organization.name
        };
        // apiの中で組織情報を関数に渡す
      setTable(org);
    });
    });
    return e;
  });
})();

らむさん、補足ありがとうございます。

さて、sakamotoさんの質問は
「changeイベントではasync/await を使いたいのに使えないので困っている」という質問かと思っていたので、
async/await を使った参考になりそうなリンクを貼り付けました。

また、async/await を使っても使わなくても、kintone.app.record.get() と kintone.app.record.set() は必要です。

return event;

をする前にchangeイベントの処理が終わってしまうので、値が更新されません。

ループ内でasync/await を用いる場合、
順番が関係ない場合はPromise.allを使うと良いと思います。

ただ、わざわざ使う必要もないので、らむさんのサンプルコードで十分かと。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。