javascript - 如何防止在 node.js 中使用相同的 URL 进行两次调用

标签 javascript node.js caching promise fetch-api

我要对后端进行 x 次调用。其中一些指向相同的 URL。我正在缓存结果。但我的问题是,如果我使用相同的 URL 立即调用 loadCached 两次(或多次),它实际上也会调用 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 解析。

最佳答案

您需要缓存整个 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] 是不正确的。

关于javascript - 如何防止在 node.js 中使用相同的 URL 进行两次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47354369/

相关文章:

javascript - 用简单的方式解释为什么分配给第一个变量的第二个变量没有更新?

javascript - 使用 javascript 循环动态 JSON 数据

javascript - 如何使用 GreaseMonkey 脚本覆盖 (css) 元类属性?

node.js - 为什么我需要刷新页面才能获得新状态React Express

java - 如何使用 Guava 的 LoadingCache 更新存储在缓存中的 LinkedList 值

c# - OptimisticConcurrencyException:使用共享的AppFabric缓存和相同的数据库的多个基于EF的应用程序

javascript - 将 Div 动态放置在文本框下方以显示选项

node.js - NodeJs + PostgreSQL + ElasticSearch

javascript - NodeJS无法识别对象的功能

c++ - 实例休眠后,Google App Engine 是否会缓存已编译的代码?