服务人员和承诺时间问题

时间:2019-07-05 16:31:14

标签: javascript

我正在尝试扩展google docs解决方案,以便在缓存为空(或已过期)时从服务器获取内容,但是在承诺时间方面遇到了问题。

我的代码如下:

self.addEventListener("fetch", function(event) {
    if (event.request.url.indexOf("targetPage") !== -1) {
        const cacheName = 'myCacheName';
        event.respondWith(
            caches.open(cacheName).then(function(cache) {
                return cache.match(event.request).then(function(response) {
                    if(response !== undefined){
                        for (var pair of response.headers.entries()) {
                            if(pair[0] === 'date'){
                                var tokenExpiryDate = Date.parse(pair[1]);
                                var now = Date.parse(Date());
                                if(tokenExpiryDate < now){
                                    return response;
                                }
                                else{
                                    fetch(event.request).then(function(serverResponse) {
                                        cache.put(event.request, serverResponse.clone());
                                        return serverResponse;
                                    })
                                }
                            }
                        }
                    }
                    else {
                        fetch(event.request).then(function(serverResponse) {
                            cache.put(event.request, serverResponse.clone()); return serverResponse;
                        })
                    };
                });
            })
        );
    }
});

结果我得到了错误:

  

导致网络错误响应:不是   响应已传递给responseWith()。

我怀疑serverResponse显示一个值是由于调试器被暂停,有时我发现它是undefined

enter image description here

来自Google文档的原始代码(对我来说也很好)如下:

self.addEventListener("fetch", function(event) {
    if (event.request.url.indexOf("targetPage") !== -1) {
        const cacheName = event.request.headers.get("myCache");
        event.respondWith(
            caches.open(cacheName).then(function(cache) {
                return cache.match(event.request).then(function(response) {
                    return (
                        response ||
                        fetch(event.request).then(function(response) {
                            cache.put(event.request, response.clone());
                            return response;
                        })
                    );
                });
            })
        );
    }
});

1 个答案:

答案 0 :(得分:0)

因此,通过尽可能接近原始解决方案,我能够使其正常工作:

.removeChild