【发布时间】:2022-03-16 19:49:27
【问题描述】:
我已经完成了一个简单的 service-worker 来推迟我的 JS 应用程序失败的请求(在 this example 之后),它运行良好。
但是当请求成功时我仍然有一个问题:请求完成了两次。由于fetch() 电话,我猜是正常一次,一次由服务人员调用。
这是一个真正的问题,因为当客户端要保存数据时,它们会被保存两次......
代码如下:
const queue = new workbox.backgroundSync.Queue('deferredRequestsQueue');
const requestsToDefer = [
{ urlPattern: /\/sf\/observation$/, method: 'POST' }
]
function isRequestAllowedToBeDeferred (request) {
for (let i = 0; i < requestsToDefer.length; i++) {
if (request.method && request.method.toLowerCase() === requestsToDefer[i].method.toLowerCase()
&& requestsToDefer[i].urlPattern.test(request.url)) {
return true
}
}
return false
}
self.addEventListener('fetch', (event) => {
if (isRequestAllowedToBeDeferred(event.request)) {
const requestClone = event.request.clone()
const promiseChain = fetch(requestClone)
.catch((err) => {
console.log(`Request added to queue: ${event.request.url}`)
queue.addRequest(event.request)
event.respondWith(new Response({ deferred: true, request: requestClone }))
})
event.waitUntil(promiseChain)
}
})
如何做好?
编辑:
我认为我不必重新fetch() 请求(因为这是第二次请求的原因)并等待触发fetchEvent 的初始请求的响应,但我不知道如何做。 fetchEvent 似乎无法等待(并读取)响应。
我走对了吗?如何知道触发fetchEvent的请求何时有响应?
【问题讨论】:
-
双重请求的原因 - 客户端发出请求,获取侦听器看到它并发出第二个请求(根据您的说明)。为了防止这种情况,请从 catch 内部删除 response with,在 waitUntil 添加 event.respondWith(promiseChain) 和你完成。因此,您的侦听器监视、接管、发出请求、向客户端发送返回调整后的承诺。
标签: javascript service-worker fetch-api workbox