changeイベントでの async/await について

 async/await について勉強中です。

以下のソースのようにchangeイベントで、ほかのアプリ(会社カレンダー)から休日を

取得する処理を書いてみましたが2点ほど教えていただきたいことがあり、投稿させていただきました。

①動きとしては正しく動いているようですが、添付のようなエラーがコンソールに表示されます。どこかを修正すれば治りますでしょうか?

②この休日取得の処理をいろいろな場面でコールしたいので関数にしたいのですが、その場合async/await はどこに記述することになりますでしょうか?

 

 

(()=> {

    ‘use strict’;

 

     // hh:mm を分に変換

     function strToMin(str) {

        const hm = str.split(“:”);

        return parseInt(hm[0]) * 60 + parseInt(hm[1]);

    }

    var inputEvents = [

        ‘app.record.edit.change.訪問日’,

        ‘app.record.create.change.訪問日’,

        ‘mobile.app.record.edit.change.訪問日’,

        ‘mobile.app.record.create.change.訪問日’

    ];

    kintone.events.on(inputEvents, async event => {

 

        //kintoneオブジェクトセット(モバイル or PC)

        const KINTONE = event.type.includes(‘mobile’) ? kintone.mobile : kintone;

        const erec = event.record;

        let isHoliday = ‘平日’;

        const apiUrl = kintone.api.url(‘/k/v1/records.json’,true);

        const params = {

            app: 22,

            query: ‘日付 = "’ + erec.訪問日.value + ‘"’

        };

        await kintone.api(apiUrl,‘GET’,params,(resp) => {

            // 表示中レコードの取得

            let recordData  =  KINTONE.app.record.get(), grec = recordData.record;

            if (resp.records.length === 0) {

                // 会社カレンダー登録なし

                const checkWeek = dayjs(erec.訪問日.value);

                //曜日チェック

                if (checkWeek.format(‘d’) === ‘0’ || checkWeek.format(‘d’) === ‘6’){

                    isHoliday = ‘休日’;

                }

            }else{

                // 会社カレンダー登録あり

                if(resp.records[0].会社休日.value === ‘会社休日’ || resp.records[0].会社休日.value ===‘祝日’ ){

                    isHoliday = ‘休日’;

                }

            }

            //更新処理

            grec[‘平日休日’].value = isHoliday;

            KINTONE.app.record.set(recordData);

        }, (error) => {

            console.log(error);

        })

        return(event);

    });

})();

予想で試してないのですが(すみません。。)changeイベントにasync使えないはずなので、そこを外して、await kintone.api~のawaitを外す。

それとその中のファンクション内に対してもasync/awaitかけるようにすればいけるようなですが気がしますが、どうでしょうか?

(()=> {

    'use strict';




     // hh:mm を分に変換

     function strToMin(str) {

        const hm = str.split(":");

        return parseInt(hm[0]) * 60 + parseInt(hm[1]);

    }




    var inputEvents = [

        'app.record.edit.change.訪問日',

        'app.record.create.change.訪問日',

        'mobile.app.record.edit.change.訪問日',

        'mobile.app.record.create.change.訪問日'

    ];



//変更
  kintone.events.on(inputEvents, event => {




        //kintoneオブジェクトセット(モバイル or PC)

        const KINTONE = event.type.includes('mobile') ? kintone.mobile : kintone;

        const erec = event.record;




        let isHoliday = '平日';

        const apiUrl = kintone.api.url('/k/v1/records.json',true);

        const params = {

            app: 22,

            query: '日付 = "' + erec.訪問日.value + '"'

        };
//変更
      kintone.api(apiUrl,'GET',params, async (resp) => {




            // 表示中レコードの取得

          let recordData  =  await KINTONE.app.record.get(), grec = recordData.record;

            if (resp.records.length === 0) {

                // 会社カレンダー登録なし

                const checkWeek = dayjs(erec.訪問日.value);

                //曜日チェック

                if (checkWeek.format('d') === '0' || checkWeek.format('d') === '6'){

                    isHoliday = '休日';

                }

            }else{

                // 会社カレンダー登録あり

                if(resp.records[0].会社休日.value === '会社休日' || resp.records[0].会社休日.value ==='祝日' ){

                    isHoliday = '休日';

                }

            }

            //更新処理

            grec['平日休日'].value = isHoliday;
//変更
          await KINTONE.app.record.set(recordData);

        }, (error) => {

            console.log(error);

        })

        return(event);

    });

})();

nabe様

なんだか試行錯誤しましたが、いただいたソースをアレンジして、うまくできました。

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

async/await 

についてはもう少し勉強したいと思います。

お世話になりました!

お返事遅れすみません。

kintone.app.record.getとsetは同期っぽいんでawaitで待たなくても大丈夫そうですね。すみません。。

 

>kintone.app.record.getとsetは同期っぽいんでawaitで待たなくても大丈夫そうですね

そうなんですね・・・

(^_^;)

エラーはでなくなったので、これでよいと私も勝手に解釈してました。スミマセン(^_^;)

やはりchangeイベントで会社カレンダーからGETを待つ方法が必要ということでしょうか。

そしたら、チェンジイベント内のkintone.api~をラップしたasync関数を作って、それをチェンジイベント内で実行したほうがいいかもしれませんね。ざっくりサンプルですが、こんな感じでいかがでしょうか

(() => {
    // async関数を作成。その中でkintone.apiはawait で実行
    const test = async (record) => {
        const params = { app: kintone.app.getId(), query: '' };
        await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', params, (resp) => {
            let res = kintone.app.record.get()
            let record = res.record
            record["文字2"].value = record["文字"].value
            kintone.app.record.set(res)
        })
    }

    // チェンジイベント
    var inputEvents = ['app.record.edit.change.文字',];
    kintone.events.on(inputEvents, event => {

        // 作成した関数で実行
        test(event.record)
        return event
    });
})();

nabe様

ありがとうございます。

ラップしたことないです。試してみます。

 

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