2017-01-23 21 views
0

點擊按鈕時,我成功註冊了sync,它觸發了我在service-worker中描述的功能。 如果我處於離線狀態 - 它會等待瀏覽器獲得連接,然後啓動。服務人員同步僅在第一時間觸發

但是 - 當我點擊按鈕,第一次和所有的罰款 - 從此再次單擊按鈕成功註冊爲sync,但sync事件在服務工作者從未觸發:

self.addEventListener('sync', function(event) { 
    console.log('EVENT in SYNC', event); 
} 

我看到控制檯僅在第一次單擊按鈕時進行日誌記錄。 我錯過了什麼嗎?

+0

您是否檢出了https://jakearchibald.github.io/isserviceworkerready/demos/sync/並確認您的代碼正在執行相同的操作?如果這沒有幫助,您能否請您發佈客戶端頁面和服務工作者代碼的相關部分? –

+0

噢......我修好了......忘記寫下解決方案......對不起。請看看答案:) –

回答

1

我想通了:) ...問題是非常蹩腳的:在服務工作者sync處理程序正在返回一個承諾,但這個承諾永遠不會得到解決。一旦我在處理程序中添加了resolve()返回的承諾 - 它一切正常。

PS:在Jake Archibald的演示中,sync處理程序正在做self.registration.showNotification,它返回一個承諾,並且一旦顯示通知,此承諾就會解決。在其他例子中,他們做出了簡單的fetch,這也返回了承諾,並且這個承諾在成功上得到解決。但以我的例子 - 我從indexedDB提取數據,然後製作fetch。 所以 - 就在

var p = new Promise(function(resolve, reject) { 
    // get data from indexedDB .. 
    fetch(...).then(function(response) { 
     return response; 
    }) 
    .then(function() { 
     // fetch was successful .. 
     resolve(); 
    }); 
}; 
return p; 

這樣,它工作正常包裹的一切。

+0

如果這是你的合適的解決方案,你應該標記你的答案是正確的。它給了我正確的提示;) – goemic

+0

我不能投票給我自己的帖子:) –

+0

這是正確的,但你可以標記爲正確的;-) – goemic

相關問題