Ribbit's works

kintone.events.onで非同期処理(async/await)を使う - kintone

#kintone #JavaScript
にメンテナンス済み
記事のトップ画像

今回は JavaScript カスタマイズを行う上でよく利用する非同期処理を実装する方法と、実装する上での注意点を紹介します。

実装方法

// 重たい処理
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;
});

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

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

kintone はこれを想定していて、Developer Network のほとんどのイベントで以下のように記述があります。

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

ただいくつか例外があり、app.record.create.show、app.record.edit.show、app.record.detail.show の 3 つは動作が保証されず、app.record.edit.change, app.record.create.change ではエラーが出ます。

上記の例外全てについて、確認する限り全く動かないということはありませんでしたが、正常に動作しない可能性があるので注意してください。