我开始学习PWA(渐进式网络应用程序),我有问题,控制台"抛出"错误未捕获(在承诺中)TypeError:无法获取。
任何人都知道原因可能是什么?
let CACHE = 'cache';
self.addEventListener('install', function(evt) {
console.log('The service worker is being installed.');
evt.waitUntil(precache());
});
self.addEventListener('fetch', function(evt) {
console.log('The service worker is serving the asset.');
evt.respondWith(fromCache(evt.request));
});
function precache() {
return caches.open(CACHE).then(function (cache) {
return cache.addAll([
'/media/wysiwyg/homepage/desktop.jpg',
'/media/wysiwyg/homepage/bottom2_desktop.jpg'
]);
});
}
function fromCache(request) {
return caches.open(CACHE).then(function (cache) {
return cache.match(request).then(function (matching) {
return matching || Promise.reject('no-match');
});
});
}
答案 0 :(得分:14)
我找到了同一错误的解决方案,在我的情况下,错误显示当服务工作者找不到文件时,通过在chrome会话的开发工具中跟踪网络修复它,并确定服务工作者不存在的文件没有找到并删除要注册的文件数组。
'/processos/themes/base/js/processos/step/Validation.min.js',
'/processos/themes/base/js/processos/Acoes.min.js',
'/processos/themes/base/js/processos/Processos.min.js',
'/processos/themes/base/js/processos/jBPM.min.js',
'/processos/themes/base/js/highcharts/highcharts-options-white.js',
'/processos/themes/base/js/publico/ProcessoJsController.js',
// '/processos/gzip_457955466/bundles/plugins.jawrjs',
// '/processos/gzip_N1378055855/bundles/publico.jawrjs',
// '/processos/gzip_457955466/bundles/plugins.jawrjs',
'/mobile/js/about.js',
'/mobile/js/access.js',
答案 1 :(得分:13)
我认为这是因为你没有后备策略。 event.respondWith
附带一个承诺,如果出现错误,你必须抓住它。
所以,我建议你改变你的代码:
self.addEventListener('fetch', function(evt) {
console.log('The service worker is serving the asset.');
evt.respondWith(fromCache(evt.request));
});
对于这样的事情:
addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response; // if valid response is found in cache return it
} else {
return fetch(event.request) //fetch from internet
.then(function(res) {
return caches.open(CACHE_DYNAMIC_NAME)
.then(function(cache) {
cache.put(event.request.url, res.clone()); //save the response for future
return res; // return the fetched data
})
})
.catch(function(err) { // fallback mechanism
return caches.open(CACHE_CONTAINING_ERROR_MESSAGES)
.then(function(cache) {
return cache.match('/offline.html');
});
});
}
})
);
});
答案 2 :(得分:4)
我遇到了同样的错误,在我的情况下,Adblock阻止了对以“ ad”开头的网址(例如/adsomething.php)进行抓取
答案 3 :(得分:1)
在我的情况下,找不到要缓存的文件(请检查网络控制台),这与相对路径有关,因为我使用的是localhost,并且站点位于子目录中,因为我在XAMPP服务器。
所以我改变了
C
到下面:注意cached_assets上的“ ./”
c.A::i
答案 4 :(得分:0)
在添加或获取/
或/offline.html
之类的任何路径之前,请尝试使用/main.js
答案 5 :(得分:0)
缓存文件引用应该是正确的,否则获取将失败。即使一个引用不正确,整个提取也会失败。
let cache_name = 'Custom_name_cache';
let cached_files = [
'/',
'index.html',
'css/main.css',
'js/main.js'
];
// The reference here should be correct.
self.addEventListener('install', function (e) {
e.waitUntil(
caches.open(cache_name).then(function (cache) {
return cache.addAll(cached_files);
})
);
});