加入IndexedDB
時提到它適合頻繁改變的內容,
那麼我們到firebase
上,加入第二筆文章,看頁面的變化。
firebase/Database
,新增第2筆article
2.重整網頁
會看到成功抓到兩筆文章,筆將新的一筆post-2
也放進(put
)IndexedDB
裡面。
firebase/Database
,修改post-2
的content
2.重整網站
網站內容也跟著更新!
這是因為put()
會直接拿新資料覆蓋原本資料,所以文章內容能保持變更。
到firebase/Database
,新增第3筆article
重整網站,確認網頁存入IndexedDB
的article
中
到firebase/Database
,刪除第3筆article
重整網站
這時候,發現post-3
還有在網頁上!
那是因為put
如果有內容時,會覆蓋現有的內容,
如果現有的請求中(event.request
),已沒有post-3
的請求,那麼並不會觸發到它的變更。
要解決此問題,可以在fetch
資源到資料庫前,將內容整個清除,再put
,這樣就能保證資源正常,來實作一下。
function clearAllData(table){
return dbPromise
.then(function(db){
var transaction = db.transaction(table, 'readwrite');
var store = transaction.objectStore(table);
store.clear();
return transaction.complete;
});
}
indexedDB.js
中,加入一筆clearAllData
,使用clear()
功能,能直接將article
中的所有內容清空,最後再回傳交易完成。
Service Worker
fetch(event.request)
.then(function(response){
var copyRes = response.clone();
clearAllData('article')
.then(function(){
return copyRes.json();
})
.then(function(data){
console.log('copyRes.json()',data);
for(var key in data){
console.log('key',key);
writeData('article',data[key]);
}
});
return response;
})
原本拿到文章的回應(response
)後,就轉成json
並寫入資料表,
現在要多一個步驟,先清除資料表內容後,再做原本的動作。
所以要再clearAllData
完成後,再執行copyRes.json()
,最後將資料存入資料表中。
var CACHE_STATIC = 'static-v8.4';
var CACHE_DYNAMIC = 'dynamic-v6.3';
確認IndexedDB
順利存入3篇文章。
現在頁面上的資料就跟firebase
上的資料一致,代表清除資料表重新存入有效囉。
前面已經實作「寫入」、「清除」和「讀取」,現在稍微實作一下單筆「刪除」和「讀取」
來結束這個章節吧!
function deleteArticleData(table, id){
return dbPromise
.then(function(db){
var transaction = db.transaction(table, 'readwrite');
var store = transaction.objectStore(table);
store.delete(id);
return transaction.complete;
});
}
function getArticleData(table, id){
return dbPromise
.then(function(){
var transaction = db.transaction(table, 'readonly');
var store = transaction.objectStore(table);
return store.get(id);
})
.then(function(data){
console.log('article:',data);
});
}
刪除很簡單就將文章的key
丟給delete()
就刪除成功了。
這兩三天,我們將專案加入IndexedDB
的特色,讓離線的頁面可以有更多種工具來實現,
語法上有不會太難離解,唯一要注意的是javascript
在執行上是非同步,在執行結果上,有時候會產生不一樣的結果,是可能發生的,所以,再使用Promise或一般function
時,就要考慮執行的順序或觸發時間,才不會很難偵錯。
idb: https://github.com/jakearchibald/idb
web Workers: https://developer.mozilla.org/zh-TW/docs/Web/API/Web_Workers_API/Using_web_workers
IndexedDB API: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
Google Developer: https://developers.google.com/web/ilt/pwa/working-with-indexeddb