以前、端末がオフラインで送信に失敗しても、オンラインになると再度投稿を行うBackgroundSyncを試した。このBackgroundSyncを使って、ユーザの任意のタイミングで投稿を行えるようになると思ったが、上手くいかなかったので一時断念することにした。
どのようにして実装しようとしたのかを簡単にまとめる。
ServiceWorkerでsyncイベントが発生したかどうかは以下のコードで取得ができる。
```javascript
self.addEventListener('sync', event => {
// 処理
});
```
実際に投稿が行われるのはsyncイベントなのか、それともsyncイベントをトリガーにfetchイベントが発火してfetchイベントから実行されるのかよく分からなかったので、試しにsyncイベント内でループを作ったところ、投稿が実行されなかったのでsyncイベントで発生していると思って良さそう。
そこで、ユーザが指定した時刻までループ文でsyncイベントの完了を止めて待つというのが簡単な実装だと考えた。
```javascript
self.addEventListener('sync', event => {
const estimatedTime = new Date(2018, 10, 12, 23, 59);
// 2018年11月12日 23時59分までsyncイベントを完了させないようにする
while (estimatedTime > Date.now()) { }
});
```
通常の方法と同じくオフラインで投稿をし、失敗したところでオンラインに接続を変え、予想通り指定時刻まで待機状態になり上手くいったように思えたが、指定時刻になるまでServiceWorkerはループの処理を優先してしまい、処理を書いたServiceWorkerが動作しているサイト(今回は投稿を行うだけのページ)に投稿が完了するまで再度アクセスすることができなくなってしまった。
ループ文で一切の割り込みも許さないのが良くないと考え、1秒おきの`setInterval()`も使ってみたが、今度は簡単にsyncイベントが完了してしまう結果となったので、時刻をトリガーとする関数がないと実装は難しそう(良い方法を知らないだけ)。