提取响应未与Service Worker JS一起缓存

时间:2018-11-25 08:30:00

标签: javascript api service-worker progressive-web-apps

我正在与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 ,则更新我的动态缓存,但永远不要保存答案,因为答案会留空。

动态缓存的附加图像:

Dynamic Cache Empty

0 个答案:

没有答案