bulkRequestの処理のタイミングについて

こんにちは。

今3つのアプリを開発しています。

構成は登録用の元となるアプリ(本店顧客マスタアプリ)、それから派生して使用される下流のアプリが2つ(支店売上管理アプリ、支店帳票管理アプリ)です。

元となる本店顧客マスタアプリに情報を登録すると、その情報を下流の2つに転記する形を取りたいと思っていて、この3つのアプリ間で情報の齟齬が無いようにしたいと考えています。

現在の実装では、本店顧客マスタアプリに情報を登録した後、支店売上管理アプリと支店帳票管理アプリへbulkRequestのAPIを呼び出しています。

質問したいのは、このbulkRequestを呼び出すタイミングです。

保存ボタンを押したときにbulkRequestを実行していますが、

(1)app.create/edit.submitのタイミングでbulkRequestを実行すると、本店顧客アプリがエラーで保存できないときに下流の2つだけレコードができてしまいます。

(2)app.create/edit.submit.successのタイミングでbulkRequsetを実行すると、bulkRequestに含めたどちらかのPUTまたはPOSTが失敗したタイミングでは本店顧客マスタアプリにだけレコードができてしまいます。また、successしているため、エラーメッセージを出すことなどができません。

https://developer.cybozu.io/hc/ja/articles/201255224-bulkRequest-%E3%81%A7%E8%A4%87%E6%95%B0%E3%82%A2%E3%83%97%E3%83%AA%E3%81%B8%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E6%8B%AC%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86

この記事ではどのタイミングでbulkRequestを行うか記載がないのですが、どのように実装するのが一般的でしょうか。

個人的にはbulkRequestの中に本店顧客マスタアプリ、支店売上管理アプリ、支店帳票管理アプリ3つのアプリへのPUTまたはPOSTのリクエストを格納し、本店顧客マスタアプリの保存時にこれを呼び出す必要があるのではないかと思っています。

ただ、このときはbulkRequestが成功したら保存する前に保存処理をキャンセルする必要があると思っています。

またもう一つの案として、別にボタンを作成し、そこにbulkRequestを実行するイベントリスナを登録する方法もあるかなとは思うのですが、この場合はbulkRequestが成功したら編集処理をキャンセルする必要があると思っています。

特に気にせずbulkRequestに自分自身のPUT/POSTを入れてしまっても良いものなのでしょうか。

Asmithさん

こんにちは。

 

bulkするタイミングは、submitイベントの一番最後が良いと思います。
async/await(またはkintone.Promise)を使い、bulk処理に失敗したら、自レコードの保存キャンセルすると良いです。

async/awaitについては、以下ご参考ください。

目指せ!JavaScriptカスタマイズ中級者(2) 〜Promiseのかわりにasync/await編〜

kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], async (event) => { // asyncをつける

  // フィールドチェック等

// このレコードの保存をキャンセルする場合
  // event.error = 'エラーメッセージ';
  // return event;

  // このレコードに対する諸々の処理が終わった後にbulk処理

// body設定

  try {
    // 待ちたい処理にawaitをつける
    const resp = await kintone.api(kintone.api.url('/k/v1/bulkRequest.json', true), 'POST', body);
    return event;

  } catch (e) {
    // パラメータが間違っているなどAPI実行時にエラーが発生した場合
    event.error = 'bulk失敗';
  return event; // 保存キャンセル
  }

});

 

koichiさん

コメントありがとうございます。

タイミングはそのようにしたいと思います。

ただ、今回bulkRequestのrequestsに自分自身が含まれるため、成功時も保存をキャンセルする必要があります。

結局、POST時は自分自身を含め成功時にreturn falseする、PUT時は自分自身を含めないでreturn eventするという方法で実装します。