2017-06-06 52 views
1

我一直在使用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進行測試。

回答

1

我想離線 - >在線 - >離線通過開發工具不會爲您觸發同步(在這種情況下,也不會同步),所以恐怕您必須切換網絡 - >系統。

一旦這樣做,您應該能夠看到請求重播,就像您想的那樣。

此外,如果您仍然能夠重現重複的請求(已通過2XX響應回覆的請求),請隨時打開一個錯誤。

+0

謝謝。是的,就是這樣,爲什麼我認爲它釀造後可能會起作用。機器已經睡着了,在喚醒它連接網絡時。我已經檢查過,如果我把一段時間的無線網絡打開,然後打開它,我似乎可以看到請求發生。我不得不製作一些手動代碼,並在iOS的網絡工作人員中使用它,因此我不得不在現在的項目中保留這些代碼,但我很快可能會就此做一篇博客文章。 –