如何防止在node.js中两次调用相同URL的获取

     2023-02-27     112

关键词:

【中文标题】如何防止在node.js中两次调用相同URL的获取【英文标题】:How to prevent fetch with same URL being called twice in node.js 【发布时间】: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 解决。

【问题讨论】:

你需要缓存 promise 而不是结果。 runkit.com/moongod101/5a0f1c865f47c000128a96bb 我想会有什么效果? 【参考方案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 将其标记为解决方案吗?

在php中两次调用相同的函数时出错

】在php中两次调用相同的函数时出错【英文标题】:errorincallingsamefunctiontwiceinphp【发布时间】:2015-11-2207:12:15【问题描述】:我有一个名为record_list()的函数,它可以帮助我在每次刷新/访问页面时回显从数据库中提取的查询。我... 查看详情

防止在java中两次显示Arraylist值

】防止在java中两次显示Arraylist值【英文标题】:PreventdisplayofArraylistvaluestwiceinjava【发布时间】:2015-04-1615:17:06【问题描述】:我有一个返回数组列表的方法。但是Arraylsit两次显示其值。代码是-ArrayList<Double>ref_jsp=newArrayList<... 查看详情

SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?

】SQL查询优化:在事实表中两次使用相同指标的最佳方法是啥?【英文标题】:SQLQueryOptimization:whatisthebestapproachtousesamemetrictwiceinthefacttable?SQL查询优化:在事实表中两次使用相同指标的最佳方法是什么?【发布时间】:2020-02-2618:... 查看详情

如何防止在包含的文件中包含两次相同的文件?

】如何防止在包含的文件中包含两次相同的文件?【英文标题】:HowcanIpreventtoincludesamefiletwiceinanincludedfile?【发布时间】:2012-06-0800:54:26【问题描述】:在主要的index.php文件中,包含header.php。这两个文件都必须插入session.php,databa... 查看详情

在选择查询中两次调用用户定义的函数会导致效率低下吗?

】在选择查询中两次调用用户定义的函数会导致效率低下吗?【英文标题】:Doescallingauserdefinedfunctiontwiceinselectqueryleadtoinefficiency?【发布时间】:2016-10-1007:14:18【问题描述】:我有一个简单的表格,用于存储人们的生日。我还有... 查看详情

如何不两次抓取相同的网址?

】如何不两次抓取相同的网址?【英文标题】:Howtonotscrapethesameurltwice?【发布时间】:2019-02-2021:28:07【问题描述】:我的总体目标是拥有一个在网站url期间不会被抓取的url的数组/列表,如下面的代码示例中所示的逻辑是(\'scrapy.p... 查看详情

当我输入保存时,防止在单元格编辑时进行两次保存调用[关闭]

】当我输入保存时,防止在单元格编辑时进行两次保存调用[关闭]【英文标题】:PreventtwosavecallsoncelleditwhenIenterforsave[closed]【发布时间】:2021-03-1305:25:31【问题描述】:两次调用jqgrid中的保存单元格url(一次是在输入的情况下,... 查看详情

如何防止 redux-saga 调用我的 api 调用两次?

】如何防止redux-saga调用我的api调用两次?【英文标题】:Howtopreventredux-sagafromcallingmyapicalltwice?【发布时间】:2019-12-0101:29:32【问题描述】:在新用户登录我的应用时,我正在使用redux-saga处理我的API调用。但是,我的sagawatcher调... 查看详情

Node.js,如何从我必须在其中输入用户名和密码的某个 url 获取 JSON 元素?

】Node.js,如何从我必须在其中输入用户名和密码的某个url获取JSON元素?【英文标题】:Node.js,HowtogetJSONelemetfromsomeurlwhichihavetoenterusernameandpasswordinit?【发布时间】:2020-08-1807:00:10【问题描述】:我使用这个功能:vargetJSON=function(ur... 查看详情

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件

】如何在同一列或不同列的一个sql语句中两次使用\\\'BETWEEN\\\'条件【英文标题】:howtouse\'BETWEEN\'condetiontwotimesinonesqlstatementforsamecolumnordiffrentcolumns如何在同一列或不同列的一个sql语句中两次使用\'BETWEEN\'条件【发布时间】:2011-05-... 查看详情

如何在一个 submitHandler 中两次更新反应状态

】如何在一个submitHandler中两次更新反应状态【英文标题】:HowtoupdatereactstatetwiceinonesubmitHandler【发布时间】:2018-10-2218:00:45【问题描述】:我想在React中提交一个表单,我试图用一个submitHandler更新状态两次。第二次更新依赖于第... 查看详情

如何在 C# 中两次读取 Http 响应流?

】如何在C#中两次读取Http响应流?【英文标题】:HowcanIreadanHttpresponsestreamtwiceinC#?【发布时间】:2010-09-1323:01:47【问题描述】:我正在尝试通过以下方式读取Http响应流两次:HttpWebResponseresponse=(HttpWebResponse)request.GetResponse();stream=re... 查看详情

React:如何在页面中两次渲染组件?

】React:如何在页面中两次渲染组件?【英文标题】:React:Howtorenderacomponenttwiceinapage?【发布时间】:2018-01-2605:38:50【问题描述】:我在ReactmyComponent.js中有一个组件构建ReactDOM.render(<MyComponent/>,document.getElementById(\'my-id\'));在我... 查看详情

Google Apps 脚本中两次调用(POST 和 GET)之间的延迟

】GoogleApps脚本中两次调用(POST和GET)之间的延迟【英文标题】:Delayinbetweentwocalls(POSTandGET)inGoogleAppsscript【发布时间】:2021-06-0917:42:56【问题描述】:我在***上的第一个请求!我真的希望你能帮助我!我想创建一个流程来将数据... 查看详情

Spark:在查询中两次使用临时表?

】Spark:在查询中两次使用临时表?【英文标题】:Spark:UseTemporaryTableTwiceinQuery?【发布时间】:2016-04-2820:00:41【问题描述】:我正在努力将一组Hive查询转换为在spark上运行。到目前为止,通过创建TEMP表,我已经获得了不错的性能... 查看详情

如何在 Codeigniter 中两次加入同一个表并分配表别名?

】如何在Codeigniter中两次加入同一个表并分配表别名?【英文标题】:HowtojointhesametabletwiceandassigntablealiasesinCodeigniter?【发布时间】:2012-02-2719:49:57【问题描述】:我正在尝试使用PyroCms在Codeigniter中创建一个邮件系统。在我的邮件... 查看详情

如何在 Django 中两次在查询中使用过滤器

】如何在Django中两次在查询中使用过滤器【英文标题】:howtousefilterinquerytwiceindjango【发布时间】:2022-01-1113:42:38【问题描述】:我正在尝试使用此查询过滤一些数据,get_members=PaymentDetails.objects.filter(participants_name=Participants.objects... 查看详情

如何防止数据库获取以前未更新的旧数据

】如何防止数据库获取以前未更新的旧数据【英文标题】:Howtopreventdatabasegettingpreviousoldunupdateddata【发布时间】:2022-01-2121:43:55【问题描述】:我正在尝试在express服务器中使用带有graphql的postgresQL。我面临的问题是当用户在客户... 查看详情