《Progressive Web Apps》读书笔记九
第九章 保持数据同步
BackgroundSync
API 允许用户在离线工作时对需要发送到服务器的数据进行排队,一旦用户再次上线,会将排队中的数据发送给服务器。
9.1 理解后台同步
9.1.1 准备开始
注册后台同步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| if ('serviceWorker' in navigator && 'SyncManager' in window) { navigator.serviceWorker.register('./sw.js') .then(registration => navigator.serviceWorker.ready) .then(registration => { document.getElementById('submit').addEventListener('click', () => { registration.sync.register('contact-email') .then(() => { var payload = { name: document.getElementById('name').value, email: document.getElementById('email').value, subject: document.getElementById('subject').value, message: document.getElementById('message').value } idbKeyval.set('sendMessage', payload) }) }) }) }
|
注:idb-keyval 库是一个 IndexedDB 库。
9.1.2 Service Worker
响应同步事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| importScripts('./js/idb-keyval.js') self.addEventListener('sync', event => { if (event.tag === 'contact-email') { event.waitUntil( idbKeyval.get('sendMessaage').then(value => { fetch('/sendMessaage/', { method: 'POST', headers: new Headers({'content-type': 'application/json'}), body: JSON.stringify(value) }).then(response => { if (response.status >= 200 && response.status < 300) { idbKeyval.delete('sendMessaage') } }) }) ) } })
|
9.1.3 提供备用方案
1 2 3 4 5
| if ('serviceWorker' in navigator && 'SyncManager' in window) { } else { }
|
9.3 定期同步
1 2 3 4 5 6 7 8 9 10 11 12
| navigator.serviceWorker.ready.then(function (registration) { registration.periodicSync.register({ tag: 'get-latest-news', minPeriod: 12 * 60 * 60 * 1000, powerState: 'avoid-draining', networkState: 'avoid-cellular' }).then(function (periodicSyncReg) { }, function () { }) })
|
powerState:
- auto:允许在电池消耗过程中进行同步,但如果设备启用了省电模式,则可能会受到限制。
- avoid-draining:电池未充电时,推迟电池供电的设备的同步。
networkState:
- avoid-cellular:设备连接到蜂窝网络时推迟同步。