workbox-backround-sync自动检测设备是否已重新联机

时间:2017-06-06 19:55:10

标签: service-worker workbox

我一直在试验workbox服务工具包。

副本here表明workbox-backround-sync 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 个答案:

答案 0 :(得分:1)

我想离线翻转 - >在线 - >离线通过开发工具不会为你触发同步(在这种情况下也不会“同步”),所以我担心你必须从你的系统切换网络 - >关闭。

执行此操作后,您应该能够按照您的想法看到重播的请求。

此外,如果您仍然可以重现重复请求(已通过2XX响应回复的请求),请随时打开错误。