Promiseのかわりにasync/awaitを使ってみよう
はじめに
この記事では、Promiseの代わりにasync/awaitを使って、kintoneカスタマイズにおける非同期処理を書きやすくする方法を紹介します。
async/awaitとは
async/awaitは、APIにアクセスするような非同期処理の際も上から順に実行され、データを取得し変数に格納したり処理を待つことができるようにする記法です。
実際の使用例は後述します。
async/awaitはPromiseオブジェクトを利用しており、Promise処理を書きやすくしたものと考えて問題ありません。
Promiseの問題点
Promiseには次のようなデメリットがあります。
- 通常のコードに比べて理解が難しいこと
Promiseは非同期処理を扱うためのしくみですが、通常のコードに比べて理解が難しいことがあります。
then()やcatch()などのメソッドを使うことで、コードの流れが分かりにくくなることがあります。 - 連続する非同期処理では
then()が増えて読みにくくなること Promiseを使うと、非同期処理を連続して書く場合、then()をつなげて書く必要があります。
そのため、ネストが深くなったり、読みづらくなる原因にもなります。
API通信などの非同期処理が行われる場合、JavaScriptの仕様上、同期的にレスポンスを待つことはできません。
このため、非同期の実行結果を扱う際にはPromiseなどのしくみが必要になります。
以下はPromiseを使って3回直列で他のレコードを取得する例です。
|
|
async/awaitの利点
async/awaitを使うことで、次のようなメリットがあります。
- Promiseを使った非同期処理と比べて簡潔で直感的に書ける。
- 複数の非同期処理を順番に実行する場合でも、then()で何度もつなげる必要がない。
- Promiseをベースにしているため
.then()や.all()などのメソッドが使用できる。
ここでは、Promiseを使ったコードとasync/awaitを使ったコードを比較してみます。
-
通常のPromiseでレコード詳細画面を開いたときに1件のレコードを取得する。
1 2 3 4 5kintone.events.on('app.record.detail.show', () => { return kintone.api('/k/v1/record.json', 'GET', {app: 1, id: 1}).then((resp) => { console.log(resp); // 取得内容表示 }); }); -
async/awaitを使ってレコード詳細画面を開いたときに1件のレコードを取得する。
1 2 3 4kintone.events.on('app.record.detail.show', async () => { const resp = await kintone.api('/k/v1/record.json', 'GET', {app: 1, id: 1}); console.log(resp); // 取得内容表示 });
このように書くだけで、通常の変数宣言のように、resp変数にAPIから取得したResponseを格納できます。
ルールとしてawaitを使う場合は、その関数の先頭にasyncを付け、async関数だということを示す必要があります。
async関数はPromiseを返却します。
そのため、kintone側も結果を待つことができています。
async/awaitの使い方
このように、関数の頭にasyncを宣言し、待ちたい処理の箇所にawaitを宣言します。
asyncをつけ忘れることも多いので気を付けてください。
実際のkintoneでの使い方の詳細は具体例で示します。
|
|
MDNにも例がありますので必要に応じて参照してください。
mdn web docs:
async function
具体例
その他具体的な例も見ていきましょう。
比較のために通常のPromiseで書いたものと、async/awaitで書いたものを示します。
例1:レコード編集時に別レコードから取得したデータを使ってデフォルト値を設定する
Promiseを使った例
|
|
async/awaitを使った例
|
|
エラー制御にはtry/catch構文を使用します。
kintone.api()からどのようなエラーが返却されるかは下記リファレンスを参考ください。
レスポンス - HTTPステータスコード
例2:レコード保存時に3つのレコードを取得し、合算する
Promiseを使った例
|
|
async/awaitを使った例
このように特に数珠つなぎで書く場合、非常に見通しがよくなりますね。
|
|
Promiseを考慮する(Promiseは不要ということではない)
async/awaitを使えば一切Promiseについて知らなくてもよいかというとそういうことではなく、前述のとおり非同期処理を書きやすくなっただけですので、Promiseの概念自体は知っている必要があります。
Promiseも使えるとベターです。
|
|
上記のように書くなら、async/awaitで統一したほうがよいです。
|
|
Promiseとasync/awaitには次のような関係性があります。
- awaitを使ってPromiseの処理の終了を待つことができる。
すでに例で示してあるとおり、kintone.api()をawaitで待つことができます。
それはkintone.api()はPromiseオブジェクトを返却しているためです。 - async関数はPromiseを返却する。
async関数はPromiseオブジェクトを返却します。
そのため上記のようにthenとawaitを両方使い合わせることができます。
ただし、混乱の元になりますので極端に書き方を混在させるようなことはしないほうがよいでしょう。
さいごに
async/awaitは、Promiseを使った非同期処理をより簡潔かつ直感的に記述するための構文です。 これにより、非同期処理のコードは可読性が高くなり、メンテナンスもしやすくなります。 他アプリのデータ取得など非同期処理が必要な場面で活用していきましょう。
このTipsは、2025年7月版kintoneで動作を確認しています。
