非同期処理(async/await)

にメンテナンス済み

kintone の JavaScript カスタマイズで、kintone.events.on に登録するイベントハンドラーを async/await で書く方法と、実装する上での注意点を紹介します。

API の呼び出しなど、完了を待ってからレコードの値を書き換えたい場合に利用します。

実装方法

// 重たい処理
const heavyProcess = () => {
  return new Promise((resolve) => setTimeout(() => resolve('1秒かかる処理が完了しました'), 1000));
};

// 無名関数で実装
kintone.events.on(['app.record.index.show'], async (event) => {
  const result = await heavyProcess();
  console.log(result);
  return event;
});

// 関数を用意したうえで実装
async function handler(event) {
  const result = await heavyProcess();
  console.log(result);
  return event;
}

kintone.events.on(['app.record.create.show'], handler);

注意点

kintone.events.on に登録した関数は、引数として受け取った event を最終的に return します。

kintone.events.on(['app.record.print.show'], (event) => {
  // 借りたらちゃんと返す
  return event;
});

この関数を async にするということは、返却される値が event から Promise<event> になるということです。

kintone.events.on(['app.record.print.show'], async (event) => {
  // 返却されるのはeventそのものではなく、Promiseにラップされたオブジェクト
  return event;
});

kintone はこれを想定していて、cybozu developer network の各イベントのページに以下のような記述があります。

kintone.Promise オブジェクトを return すると、非同期処理の完了を待って次の処理を開始します。

ただし、イベントによっては Promise に対応していないものがあります。投稿時点(2021 年)では app.record.create.show、app.record.edit.show、app.record.detail.show は動作が保証されておらず、app.record.edit.change や app.record.create.change ではエラーになることを確認していました。

対応状況は kintone のアップデートで変わる可能性があるため、利用するイベントごとに最新の公式ドキュメントで「Promise に対応しているか」を確認してください。

#kintone #JavaScript