2016-07-22 110 views
1

在接收消息时进行简单的服务工作更新,如下所示。这工作正常,缓存更新。但接下来是让其中一个文件无法访问,并尝试获得某个失败的通知。如何列出请求的结果?如何访问Cache.addAll()请求数组

看这里 [https://developer.mozilla.org/en-US/docs/Web/API/Cache/addAll][1]

美国 “期间检索成为密钥存储的响应操作请求对象创建的。” 这是如何解释?并在代码访问?今年

self.addEventListener('message', event => { 
    console.log('EventListener message ' + event.data); 

event.waitUntil(
    caches.open('minimal_sw').then(cache => { 
     return cache.addAll(fileList).then(function(responseArray){ 
     console.log('EventListener responseArray ' + responseArray); 
     self.skipWaiting(); 
     }); 
    }) 
) 
}); 

回答

3

此前,addAll()行为是changed因此,如果任何底层请求返回没有一个2xx状态代码响应它会拒绝。此新行为在支持Cache Storage API的所有浏览器的当前版本中实施。因此,如果您想要检测何时一个(或多个)请求失败,则可以将.catch()链接到您的addAll()调用的结尾处。

但是,要回答你的问题更普遍,当你传递一个字符串数组addAll(),他们implicitly converted(第6.4.4.4.1)使用全部由Request构造所隐含的违约Request对象。

那些Request创建的对象是短暂的,但不会保存在随后的then()中的任何地方。如果由于某种原因,你真的很需要那是用来做then()内的网络请求实际的基础Request对象,你可以明确地构建Request对象的数组,并将其传递到addAll()

var requests = urls.map(url => new Request(url)); 
caches.open('my-cache').then(cache => { 
    return cache.addAll(requests).then(() => { 
    // At this point, `cache` will be populated with `Response` objects, 
    // and `requests` contains the `Request` objects that were used. 
    }).catch(error => console.error(`Oops! ${error}`)); 
}); 

caches.open('my-cache') 
    .then(cache => cache.keys()) 
    .then(keys => console.log(`All the keys: ${keys}`)); 

没有必要保留:当然,如果你有一个Cache对象,并希望得到的键(对应于请求的URL)的列表,你可以通过keys()方法做,在任何点一个参考到原来用于填充缓存的Request

+0

感谢您的详细解答,清理了很多东西。 –