缓存 JavaScript 承诺结果

2023-11-23

我会向服务器发出一次调用以获取项目列表。如何确保仅进行一次调用并且仅处理集合一次以创建键值映射。

var itemMap = {};

function getItems(){
    getAllItemsFromServer().then(function(data){
     data.forEach(value){
       itemMap[value.key] = value;
     }});
     return itemMap;

}

//need to get the values from various places, using a loop here  
//to make multiple calls
var itemKeys = ['a', 'b', 'c'];
itemKeys.forEach(key){
   var value = getItems().then(function(data){ return data[key]});
   console.log('item for key=' + value);
}

我将添加一个通用方法来缓存 Promise 操作。 这里的技巧是,通过将 Promise 视为值的真实代理并缓存它而不是值,我们可以避免竞争条件。这也适用于非 Promise 函数,说明 Promise 如何很好地捕获 async + value 的概念。我认为这会帮助你更好地理解这个问题:

function cache(fn){
    var NO_RESULT = {}; // unique, would use Symbol if ES2015-able
    var res = NO_RESULT;
    return function () { // if ES2015, name the function the same as fn
        if(res === NO_RESULT) return (res = fn.apply(this, arguments));
        return res;
    };
}

这将使您可以非常轻松地缓存任何承诺(或非承诺操作):

 var getItems = cache(getAllItemsFromServer);


 getItems();
 getItems();
 getItems(); // only one call was made, can `then` to get data.

请注意,您不能使其“同步”.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓存 JavaScript 承诺结果 的相关文章

  • 在数组/对象中查找项目的最快方法

    在 Javascript AS3 中查找列表或对象中项目的索引的最快方法是什么 我对这两种语言都提出这个要求 因为这两种语言的语法相似 假设 myArray one two three myObject one 1 two 2 three
  • 对自定义打字稿错误实例实施instanceof检查?

    打字稿有这个instanceof 检查自定义错误 https github com Microsoft TypeScript issues 13965问题 但尚不清楚我们需要做什么才能得到instanceof在职的 例如对于这个异常我们如何
  • 如何从ArrayBuffer中获取二进制字符串?

    JavaScript中如何从ArrayBuffer中获取二进制字符串 我不想对字节进行编码 只需将二进制表示形式获取为字符串 提前致谢 以下代码将一致地转换ArrayBuffer to a String并再次返回 而不会丢失或添加任何额外的
  • 按下了哪个提交按钮?

    在这个jsfiddle中 http jsfiddle net littlesandra88 eGRRb http jsfiddle net littlesandra88 eGRRb 我是否提交了自动生成的按钮 每个表行都有一个唯一的 ID
  • 邮件附件媒体类型错误 Gmail API

    我正在尝试通过 Javascript 客户端中的 Gmail API 发送带有附加 jpeg 文件的消息 到目前为止我写的代码如下 ajax type POST url https www googleapis com upload gma
  • ExtJS 4:克隆商店

    我正在尝试找出如何克隆Ext data Store不保留旧的参考 让我用一些代码更好地解释一下 这是源商店 var source Ext create Ext data Store fields name age data name foo
  • React延迟加载/无限滚动解决方案

    我花了一段时间才弄清楚如何使用优秀的延迟加载图像React Lazyload 组件 https github com jasonslyvia react lazyload 演示在滚动时延迟加载图像 但在测试时我无法获得相同的行为 罪魁祸首是
  • 如何从 URL 字符串中删除某些参数?

    我有这个var存储表示充满参数的 URL 的字符串 我正在使用 AngularJS 我不确定是否有任何有用的模块 或者可能使用纯 JavaScript 来删除不需要的 URL 参数而无需使用正则表达式 例如我需要删除 month 05并且
  • 一个 Next.js 路由中的两个不同子域

    我想使用构建一个新平台Next js https nextjs org React js https reactjs org and 反应路由器 https reacttraining com react router web guides
  • 检测 iframe 内容加载失败

    我可以使用以下命令检测 iframe 的内容何时加载load事件 不幸的是 就我的目的而言 这有两个问题 如果加载页面时出现错误 404 500 等 则永远不会触发加载事件 如果某些图像或其他依赖项加载失败 则会照常触发加载事件 有什么方法
  • React:React 如何确保在浏览器有机会绘制之后调用 useEffect?

    useLayoutEffect 的文档说 useLayoutEffect 内计划的更新将被刷新 在浏览器有机会绘制之前同步进行 useEffect 的文档说 与 componentDidMount 和 componentDidUpdate
  • 如何获取数组中最后 5 个元素(不包括第一个元素)?

    在 JavaScript 数组中 如何获取最后 5 个元素 排除第一个元素 1 55 77 88 would return 55 77 88 添加其他示例 1 55 77 88 99 22 33 44 would return 88 99
  • 带有嵌入式 Ruby 的 Javascript:如何安全地将 ruby​​ 值分配给 javascript 变量

    我在页面的 javascript 块中有这一行 res foo 处理这种情况的最佳方法是什么 ruby var里面有单引号吗 否则会破坏 JavaScript 代码 我想我会用红宝石JSON http json org ruby var 上
  • 禁用任何类型的浏览器窗口滚动?

    有没有办法禁用滚动 不仅仅是滚动条 还有浏览器窗口的全部功能 根据您对 Keit 的回答 您不想在打开灯箱时滚动处于活动状态 如果是这种情况 您可以使用以下 css 在打开灯箱的同时向正文添加一个类 这个解决方案的好处是它保留了滚动 空间
  • 比较 javascript 元素和 scala 变量的 Play 框架 Twirl 模板

    如下面的代码示例所示 我想比较 scala 辅助元素内的 javascript 元素 然而 即使存在元素 abcde 它也始终返回 false 除了使用标签之外 如何获取 scala 辅助元素内的 javascript 值 appSeq S
  • chrome 扩展 - 将数据从后台传递到自定义 html 页面

    创建浏览器扩展 我必须从 background js 打开新选项卡并将 JSON 数据传递到这个新选项卡 在新选项卡中 我使用传递的 JSON 数据来操作 渲染 DOM 下面是我的 background js 的一部分 我在其中使用自定义
  • 如何使用 .append() 将 React 组件附加到 HTML 元素

    我正在尝试对我的博客实现无限滚动 我有 const articlesHTML document querySelector articles 作为容器 每次点击装载更多按钮 我想将新文章附加到主 html 元素 如下所示 const res
  • nvd3.js - 无法更改折线图中线条的颜色

    我正在尝试更改 nvd3 折线图不同线条的颜色here http nvd3 org livecode index html codemirrorNav但我无法理解该怎么做 我想将示例中的 2 条线的颜色更改为绿色和青色 我试过 nv add
  • 使用 JavaScript 从 URL 变量读取来加载不同的 CSS 样式表

    我试图在我的 WordPress 博客上使用两个不同的样式表 以便在通过 Web 访问页面时使用一个样式表 而在通过我们的 iOS 应用程序访问博客内容时使用另一个样式表 现在 我们将 app true 附加到来自 iOS 应用程序的 UR
  • 响应式菜单:悬停子菜单显示错误

    简而言之 我根据教程创建了一个响应式菜单 当您将鼠标悬停在投资组合按钮上时 菜单应该显示子菜单 而在移动模式下 您需要按该按钮才能显示子菜单 效果很好 问题是该教程有一个错误 如果您在桌面模式下按组合按钮 子菜单将不会再次显示 除非您按 单

随机推荐

  • Ember:嵌套组件事件冒泡

    我创建了一组嵌套组件 代码在这里 http emberjs jsbin com hasehija 2 edit HTML level 1 level 2 level 3
  • String.Format 一个整数以在丹麦文化中使用带有小数值的千位分隔符

    我有一根绳子totalPRice它的值是这样的1147 5我想要两件事 1 对值进行四舍五入 以便后面始终有两位数 2 在此字符串中实现千位分隔符 这样最终的输出将是这样的1 147 50我尝试过这样的事情 String Format 0
  • 使用 htaccess 将子目录重定向到子域

    我对使用 htaccess 比较陌生 除了我在网上阅读的内容之外 从未做过任何编码 我正在使用 Bluehost 并且我想将我的博客子目录重定向到子域 示例 我想将 www example com blog 重定向到 blog exampl
  • 使用 HttpContextScoped() 时 StructureMap 不会处理数据上下文

    我的目标是拥有一个数据上下文 MainDbContext ASP NET MVC 中的每个 HTTP 请求 并在请求结束时处理数据上下文 我正在使用以下 StructureMap 配置 public static class Contain
  • 连接文件与路径以获得C中的完整路径

    使用 C 我尝试将目录中的文件名与其路径连接起来 以便我可以为每个文件调用 stat 但是当我尝试在循环内使用 strcat 时 它将前一个文件名与下一个文件名连接起来 它在循环期间修改argv 1 但我已经很长时间没有使用C了 所以我很困
  • 为 PHP 数组的每一项添加前缀

    我有一个 PHP 数字数组 我想在其前面加上减号 我认为通过使用爆炸和内爆这是可能的 但我对 php 的了解不可能真正做到这一点 任何帮助 将不胜感激 本质上我想从这里开始 array 1 2 3 4 5 to this array 1 2
  • 在 MySQL 中存储时间间隔值的最佳方法?

    愚蠢的简单问题 但我一直无法找到一个优雅的解决方案 我想将时间间隔存储在 MySQL 列中 例如 1 40 1小时40分钟 0 30 30 分钟 然后能够运行查询并对它们求和 现在我将它们存储为 INT 值 1 40 但我必须手动进行加法
  • Numpy 数组每个项的均值和标准差

    我有一个二维数组 相同形状 的列表 并且希望在与输入形状相同的结果数组中获取所有项的平均值和偏差 我很难从文档中了解这是否可能 我对 axis 和 keepdims 参数的所有尝试都会产生不同形状的结果 例如 我希望有 mean x x 等
  • 使用 Hibernate (JPA) 查询 Postgresql 找不到表

    我正在使用 JPA 与 Hibernate 和 Postgresql 开发一个应用程序 使用 Netbeans 向导 我从现有数据库创建了实体类 其中一个类的摘录如下 Entity Table name ADM TYPES XmlRootE
  • 更改数据库中所有存储过程的 ANSI_NULLS 设置

    我们在 ANSI NULLS 设置和计算列方面存在一些问题 并且我们有大量的存储过程 SET ANSI NULLS OFF 我们想把它们全部改成 SET ANSI NULLS ON 有没有一种简单的方法可以做到这一点 或者我必须将所有 SP
  • 如何使用 dart_pdf 将资产图像和图标转换为 flutter 中的 PdfImage

    使用的库 dart pdf搜索后我发现同样的问题GITHUB但无法解决问题 我尝试了这个 但出现了模糊的图像 请帮忙 ByteData data await rootBundle load assets test jpg var codec
  • 改变iphone sdk中图像的颜色

    我有一个图像 我想通过编程更改该图像的颜色 我想改变这张图片的颜色 UPDATE 使用这个方法 UIImage imageNamed NSString name withColor UIColor color load the image
  • Rails flash[:notice] 总是 nil

    我不明白为什么我的 Rails 视图无法识别 flash notice 或 flash error 关于渲染的部分视图 我不断收到以下错误 具体错误是 ActionView Template Error 当你没有预料到时 你得到了一个 ni
  • 在每个文档中构建具有附加字段的反应式出版物

    我想制作一个包含几个附加字段的出版物 但我不想使用Collection aggregate当集合发生变化时 我的出版物更新就会丢失 所以我不能只使用self added在其中 我打算使用Cursor observeChanges为了实现这一
  • GMP pow 中的溢出处理

    我只是 GMP 库的间接用户 主要通过swi prolog and yap 但我对解决这个问题非常感兴趣 当使用大得离谱的值执行求幂时 主机系统或 GMP 不再能够适当地处理溢出 我已经与上述系统的开发人员交谈过 但他们没有看到解决此问题的
  • 在进程和 DLL 之间共享全局/静态变量

    我只想在进程和进程调用的 dll 之间共享静态 全局变量 exe和dll位于同一内存地址空间 我不希望该变量在其他进程之间共享 问题的阐述 假设有一个静态 全局变量x in a cpp 两个都是exefoo exe和动态链接库bar dll
  • 以编程方式更改 android:digits

    我在布局 xml 中有这个 android digits 0123456789 android inputType phone gt 我想要的是能够以编程方式更改它并且能够来回更改它 输入 Type 部分很好 manual ip setIn
  • 如果特定情况没有返回结果,则使用 count(*) 显示零

    我有一个这样的查询 它返回 city 中每个案例的行数 select case edition id when 6 then DELHI when 50 then AHMEDABAD when 4 then HYDERABAD when 2
  • Android L“令人愉快的”可绘制转换

    Google 是否允许使用图标诸如此类的过渡由开发商创建 或者是开发人员有责任创建这种 令人愉快的 过渡 我真的很想在我的应用程序中实现这些 具体是这样的图标 您可以使用 AnimatedDrawable 和基于位图的框架创建动画图标 在L
  • 缓存 JavaScript 承诺结果

    我会向服务器发出一次调用以获取项目列表 如何确保仅进行一次调用并且仅处理集合一次以创建键值映射 var itemMap function getItems getAllItemsFromServer then function data d