fetch(),如何发出非缓存请求?


Answers:


110

提取可以获取一个包含许多自定义设置的初始化对象,您可能希望将该自定义设置应用于该请求,其中包括一个称为“标头”的选项。

“标题”选项采用一个标题对象。该对象允许您配置要添加到请求中的标头。

通过在标题中添加pragma:no-cachecache-control:no-cache,您将强制浏览器检查服务器,以查看文件是否与缓存中已有的文件不同。您还可以使用cache-control:no-store,因为它只是不允许浏览器和所有中间缓存来存储返回响应的任何版本。

这是一个示例代码:

var myImage = document.querySelector('img');

var myHeaders = new Headers();
myHeaders.append('pragma', 'no-cache');
myHeaders.append('cache-control', 'no-cache');

var myInit = {
  method: 'GET',
  headers: myHeaders,
};

var myRequest = new Request('myImage.jpg');

fetch(myRequest, myInit)
  .then(function(response) {
    return response.blob();
  })
  .then(function(response) {
    var objectURL = URL.createObjectURL(response);
    myImage.src = objectURL;
  });
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ES6</title>
</head>
<body>
    <img src="">
</body>
</html>

希望这可以帮助。


6
使用new Request和传递一些参数到cache选项呢?我正在尝试使用它,但是它不起作用。
Mitar

1
标头的大小写是否重要?即“缓存控制”与“缓存控制”。
艾萨克·莱曼

4
@IsaacLyman,尽管HTTP标头不区分大小写,但我建议您遵循建议的文档,即:“ Cache-Control”。参考:developer.mozilla.org/en-US/docs/Web/HTTP/Headers
burningfuses

90

更容易使用缓存模式:

  // Download a resource with cache busting, to bypass the cache
  // completely.
  fetch("some.json", {cache: "no-store"})
    .then(function(response) { /* consume the response */ });

  // Download a resource with cache busting, but update the HTTP
  // cache with the downloaded resource.
  fetch("some.json", {cache: "reload"})
    .then(function(response) { /* consume the response */ });

  // Download a resource with cache busting when dealing with a
  // properly configured server that will send the correct ETag
  // and Date headers and properly handle If-Modified-Since and
  // If-None-Match request headers, therefore we can rely on the
  // validation to guarantee a fresh response.
  fetch("some.json", {cache: "no-cache"})
    .then(function(response) { /* consume the response */ });

  // Download a resource with economics in mind!  Prefer a cached
  // albeit stale response to conserve as much bandwidth as possible.
  fetch("some.json", {cache: "force-cache"})
    .then(function(response) { /* consume the response */ });

参考:https : //hacks.mozilla.org/2016/03/referrer-and-cache-control-apis-for-fetch/


1
这是一个更合适的答案。您可以通过这些选项处理“ If-Modified-Since”和“ If-None-Match”之类的标头。
Nigiri

9
这似乎在Firefox(54)中有效,但在Chrome(60)中无效。Burning Fuses的答案确实有用。
Scimonster

1
我已经对其进行了测试,直到今天(2019年11月),该方法似乎都可以在Windows,Linux和Android上的Opera,Chrome和FireFox上运行。Burningfuses方法至少在Opera上失败。
Sopalajo de Arrierez,

在我的情况下,直到我另外指定时,它才强制重新加载缓存pragma: no-cache
Klesun

这不像获胜者那样尊重CORS。
skrat

14

您可以'Cache-Control': 'no-cache'像这样在标题中设置::

return fetch(url, {
  headers: {
    'Cache-Control': 'no-cache'
  }
}).then(function (res) {
  return res.json();
}).catch(function(error) {
  console.warn('Failed: ', error);
});

5

这些解决方案似乎都不适合我,但是这种相对干净的(AFAICT)黑客确实有效(改编自/webmasters/93594/prevent-browser-from-caching-text-file) :

  const URL = "http://example.com";
  const ms = Date.now();
  const data = await fetch(URL+"?dummy="+ms)
    .catch(er => game_log(er.message))
    .then(response => response.text());

这只是添加一个虚拟参数,该参数在每次查询调用时都会更改。无论如何,如果其他解决方案似乎可行,我建议使用这些解决方案,但在我的测试中,它们不适用于我的情况(例如,使用Cache-Controland的解决方案pragram)。


谢谢!这只是对我有用的东西。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.