【问题标题】:How to prevent fetch with same URL being called twice in node.js如何防止在node.js中两次调用相同URL的获取
【发布时间】:2018-05-01 10:48:10
【问题描述】:

我要对后端进行 x 次调用。其中一些指向相同的 URL。我正在缓存结果。但我的问题是,如果我立即使用相同的 URL 调用 loadCached 两次(或多次),它实际上也会调用 fetch 两次,因为在第一次 fetch 解决之前缓存没有 url。因此,缓存仅在一次提取成功完成(=已解决)时才起作用。如何改进代码以等待解决第一次提取以避免重复查询?

function loadCached(url) {
  let cache = loadCached.cache || (loadCached.cache = new Map());

  if (cache.has(url)) {
    return Promise.resolve(cache.get(url)); // (*)
  }

  return fetch(url)
    .then(response => response.text())
    .then(text => {
      cache[url] = text;
      return text;
    });
}

我正在使用 promise.all() 来等待 loadCached 解决。

【问题讨论】:

标签: javascript node.js caching promise fetch-api


【解决方案1】:

你需要缓存整个 Promise:

function loadCached(url) {
  let cache = loadCached.cache || (loadCached.cache = new Map());
  let promise;

  if (cache.has(url)) {
    promise = cache.get(url)
  } else {
    promise = fetch(url)
    cache.set(url, promise)
  }

  return promise
    .then(response => response.text())
}

还要注意,要使用map设置新值,需要使用set方法,cache[url]不正确。

【讨论】:

  • 缓存fetch 的结果不太正确,因为一旦使用了该主体,您就不能再次使用它 - 假设 fetch 与浏览器中的 fetch 工作方式相同 - 所以,@ 987654325@ 只会工作一次 - 否定缓存的使用:p - 你可以 return promise.then(response => response.clone().text()) 代替
  • 非常感谢。我验证了这项工作,并且在 node.js 案例中也需要克隆。
  • @JaromandaX 您会将您的解决方案作为答案发布,以便 Petri kan 将其标记为解决方案吗?
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 2013-02-26
  • 2013-10-25
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
相关资源
最近更新 更多