我一直在使用workbox服務工作者工具包進行試驗。如果工作箱後臺同步自動檢測設備恢復在線
副本here表明工作箱後臺同步QueuePlugin將捕獲失敗的請求,並在稍後重新播放它們。因此,通過一些挖掘,我發現瞭如何使POST方法調用工作。
但是,重播請求似乎有點擊中和錯過。使用Chrome開發工具使應用程序脫機,確實將請求放入IndexedDB中的隊列中。似乎沒有任何事情發生,我想調試。我注意到它在demo on github中使用BroadcastChannel觸發重播。所以我實現了這一點。然後從活動選項卡中的控制檯中,我在開發工具中取消選中離線,併發送postMessage。現在這些請求愉快地開了出來,響應被存儲在隊列中的每個項目中。
然後我離開機器運行,進入待機等幾個小時。然後,我在日誌中注意到,即使每個項目都有響應,它仍然愉快地發送重複的請求。
在這一點上我嘗試和複製,但不能。我發送一條BroadcastChannel消息,它只會觸發沒有響應的請求。因此,我現在回到開始階段,提出更多離線請求,確認它們在數據庫中,在線恢復並等待。沒有。
我看到它在constructor of Queue中創建了一個新的RequestManager,並在其構造函數中設置了sync事件偵聽器。所以我猜測它應該在某個時候做某件事。
我只是想確定我瞭解預期的行爲,如果有人可以幫助。
這裏是我有的代碼。
let bgQueue = new workbox.backgroundSync.QueuePlugin({
callbacks: {
onResponse: async(hash, res) => {
console.log(hash, res);
}
}
});
const requestWrapper = new workbox.runtimeCaching.RequestWrapper({
plugins: [bgQueue]
});
const route = new workbox.routing.RegExpRoute({
regExp: new RegExp('^http://localhost:4200/api/create/note'),
handler: new workbox.runtimeCaching.NetworkOnly({requestWrapper}),
method: 'POST' // Not obvious you need to do this in the docs without digging.
});
const router = new workbox.routing.Router();
router.registerRoute({route});
// Code to manaully trigger a replay.
const replayBroadcastChannel = new BroadcastChannel('replay_channel');
replayBroadcastChannel.onmessage = function() {
bgQueue.replayRequests();
};
在macOS Sierra上使用Chrome 58進行測試。
謝謝。是的,就是這樣,爲什麼我認爲它釀造後可能會起作用。機器已經睡着了,在喚醒它連接網絡時。我已經檢查過,如果我把一段時間的無線網絡打開,然後打開它,我似乎可以看到請求發生。我不得不製作一些手動代碼,並在iOS的網絡工作人員中使用它,因此我不得不在現在的項目中保留這些代碼,但我很快可能會就此做一篇博客文章。 –