イベントハンドラ内でlocation.reload()を実行することによる同期処理再実行の防止について

お世話になります。

app.record.index.show, app.record.detail.showそれぞれのイベント発生時に、外部REST APIを使用してkintoneのレコードと同期する処理を実装しました。

ただ、同期後にlocation.reload()を実行して最新のレコードを表示しようとすると、これによって再度同イベントが発生して同期処理が動作してしまいます。

つまり外部REST API、kintoneAPIのGETが1回分余計に動作していることにあなります。

これを回避するためには(location.reload()後に同期処理を実行しないようにするには)どのような対策を取ればよろしいでしょうか?

以上、ご教授のほどよろしくお願いいたします。

ツバイソ佐野さん

 

現状だと編集の排他にもかかりそうで、よろしくないですね。よくやるのは、こちらのように条件を拾って更新が必要なら更新してリロードするなのかなぁと思います(おそらく今は更新とリロードの順番が逆)。これであれば、最後に更新が来るので排他への配慮等もなくなります。ループにならないようにするには、先に述べさせて頂いたように条件を拾うか、Webストレージ等で状態を持って拾うための条件付けもしてあげるか、だと思います。

Ryo Yamashitaさん

 

ご助言いただきありがとうございます。

説明が不足していたようです。申し訳ありません。

 

外部REST API側にもDBが存在しており、これをマスタDBとしております。

同期処理は下記のフローになっています。

  1. 外部REST APIから全レコードGETする
  2. kintoneの当該appIdから全レコードGETする
  3. 1と2の差分を比較し、POST, PUT, DELETEが必要なレコードをチェックして振り分ける
  4. kintoneにPOST, PUT, DELETEを必要に応じて実行する
  5. POST, PUT, DELETEのいずれか一つでも行われた場合、location.reload()を実行する

 

問題なのは、5で実行したlocation.reload()によって1-3までが再度実行されてしまう点です。(2回目の3のチェックでは差分は出ないため、ループし続けることはありません。)

有効な対策はございますでしょうか?

となれば、やはり状態を持つしかないように思います。

「POST, PUT, DELETEのいずれか一つでも行われた」という状態を保持して、リロード後の1の処理の前にストップする感じで。

状態をどのタイミングでクリアすべきか、実現可能かは、表示画面の他の条件との兼ね合いにはなりますが。

Ryu Yamashitaさん

引き続き迅速なご助言をいただき、ありがとうございます。

状態を保持するとしたら、

>Webストレージ等に状態を持って

とのご助言を頂いておりますが、これは下記リンクのように、kintoneアプリのフィールドに一時的に退避させるということをおっしゃっていますか?

https://cybozudev.zendesk.com/hc/ja/articles/202181714-%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86-%E5%8B%A4%E6%80%A0%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BE%8B%E3%81%AB- 

web storageはHTML5のAPIのことを言っています。ググると内容や用例は沢山出て来ると思います。

Ryu Yamashitaさん

 

遅い時間までご回答いただき、誠にありがとうございました。

不勉強で申し訳ございません。HTML5のWEBストレージについて調べてみます。