我正在与Service Worker一起使用Java进行PWA
在我将要调用MercadoLibre API的app.js文件中进行抓取时,我在控制台上留下了深刻的印象,并且此代码可以使一切完美:
function getProducts(){
fetch('https://api.mercadolibre.com/sites/MLM/search?nickname=JBL.MX')
.then( res => res.json() )
.then( products => {
console.log( products.results )
} )
};
getProducts();
控制台响应:
(10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
并且在我的Service Worker中,我通过Fetch事件收到对该API的调用,以确认它是MercadoLibre API,然后以这种方式将信息保存在动态缓存中:>
self.addEventListener('fetch', e => {
let resFetch;
if( e.request.url.includes('https://api.mercadolibre/')){
console.log(' API OK');
resFetch = apiFetch( CACHE_DYNAMIC_NAME, e.request, e.request.url );
}
e.respondWith( resFetch );
});
apiFetch函数,该函数调用另一个函数来更新缓存:
function apiFetch( cacheName, request, url ) {
return fetch( request )
.then( res => {
if( res.ok ) {
console.log(url) // url ok
updateDynamiCache( cacheName, request, res.clone() );
return res.clone();
} else {
return cache.match( request );
}
}).catch( err => {
return caches.match( request );
});
}
然后 updateDynamiCache 使用API的响应更新动态缓存:
function updateDynamiCache( dynamicCache, req, response ){
if( response.ok ){
return caches.open( dynamicCache ).then( cache => {
cache.put(req, response.clone() );
return response.clone();
})
} else {
return response;
}
}
如果我使用对某些API的调用(例如 https://randomuser.me/api/?results=5000
但是,如果我调用mercadolibre API: https://api.mercadolibre.com/sites/MLM/search?nickname=JBL.MX ,则更新我的动态缓存,但永远不要保存答案,因为答案会留空。
动态缓存的附加图像: