我一直在试验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中进行测试。
答案 0 :(得分:1)
我想离线翻转 - >在线 - >离线通过开发工具不会为你触发同步(在这种情况下也不会“同步”),所以我担心你必须从你的系统切换网络 - >关闭。
执行此操作后,您应该能够按照您的想法看到重播的请求。
此外,如果您仍然可以重现重复请求(已通过2XX响应回复的请求),请随时打开错误。