防止 Angular 中的多个 $http 请求。有没有更好的办法?

2023-11-27

我构建了一个有点复杂的方法来通过 $http 返回资源。

该方法返回一个承诺,然后检查我的本地缓存是否存在资源。如果是,它将返回缓存的资源,如果不是,它将发出 $http 请求。这在资源被缓存后效果很好,但是我在加载时调用此方法的应用程序中有多个函数,并且每个函数都会发出 http 请求,因为资源尚未返回和缓存。

我想出了一个简单的检查来解决这个问题,但我觉得应该有更好的方法。我添加了一个布尔值,如果该方法正在获取资源,则该布尔值设置为 true,如果是,我会以半秒超时解析该方法,以便给请求时间来解析。代码如下。

那么,有没有更好的办法呢?

   var schools = [];
   var loadingSchools = false;

   function getAllSchools(forceUpdate) {
        return $q(function (resolve, reject) {
            if(loadingSchools) resolve($timeout(getAllSchools, 500));

            else{

                loadingSchools = true;

                if (schools.length && !forceUpdate) {
                    loadingSchools = false;
                    resolve(schools);
                    return;
                }

                console.log('$http: Getting All Schools - schoolService.js');

                $http.get(API_PATH + 'schools_GetAll', {cache:true})
                .success(function(result) {
                    schools = result;
                    loadingSchools = false;
                    resolve(schools);
                })
                .error(function(error) {
                    schools = [];
                    loadingSchools = false;
                    reject(error);
                });
            }
        });
    }

首先,我认为没有必要包装HttpPromise变成另一个承诺。随着success/error方法已弃用,你应该仅仅依靠then()方法,并治疗HttpPromise只是一个常规的承诺。

为了确保请求只发送一次,您实际上可以跟踪第一个HttpPromise您创建并在随后调用该函数时返回相同的承诺。

这是一项服务,它将接受 API 端点作为参数,并确保仅向该 API 发送一个请求。

app.factory('$httpOnce', [ '$http', '$cacheFactory',
  function ($http, $cacheFactory) {
    var cache = $cacheFactory('$httpOnce');

    return function $httpOnce(url, options) {
      return cache.get(url) || cache.put(url, $http.get(url, options)
        .then(function (response) {
          return response.data;
        }));
    };
  }
]);

Usage

function log(data) {
  console.log(data);
}

// issues an HTTP request
$httpOnce('https://api.github.com/').then(log);
// does not issue an HTTP request, returns the same promise as above
$httpOnce('https://api.github.com/').then(log);

// ...
// HTTP request completes somewhere, both promises above are resolved
// ...

setTimeout(function () {
  // immediately resolved
  $httpOnce('https://api.github.com/').then(log);
}, 5000);

这里有一个demo。在开发工具中可以看到只发出了一个请求。

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

防止 Angular 中的多个 $http 请求。有没有更好的办法? 的相关文章

随机推荐

  • 如何创建覆盖 Windows 标题栏的 Java Swing 应用程序?

    我正在开发一个将用于心理学实验的 java swing 应用程序 研究人员要求我让该程序 黑屏 以便用户不会受到外界刺激 他们希望 Swing 应用程序能够真正全屏 并且顶部没有任何类型的标题栏或最小化 最大化 关闭按钮 该软件将在使用 J
  • 如何使用 AngularJS NgRoute 启动 MixItUp

    我一直在使用 AngularJS 设置一个 jquery 插件 MixItUp 虽然我可以在使用 NgRoute 的部分视图之一中成功启动容器 但一旦我移动到其他页面视图并返回 MixItUp 似乎不知道如何启动设置再次 我尝试过 docu
  • 选择列列表中至少有一个值不为空的行

    我有一个包含许多列 例如 1000 的大数据框 我有一个列列表 由脚本生成 10 我想选择原始数据框中的所有行 其中至少我的列列表之一不为空 因此 如果我提前知道列数 我可以这样做 list of cols col1 df df list
  • 如何使用其他命名空间中的对象以及如何在 PHP 中导入命名空间

    这两行之间的主要区别是什么 obj new ArrayObject obj new ArrayObject 当我使用第一行时 出现错误 Fatal error Class Foo Bar ArrayObject not found 我不太确
  • 正则表达式匹配可以基于两行文本吗?

    假设我有 def abc xyz abc 我想匹配 xyz abc 作为一个整体 使用最通用的正则表达式可以实现这一点吗 这不是具有多行标志的 perl RegEx 或 Net Regex 我猜应该是 BNF 来匹配这个 许多正则表达式实现
  • jCarousel:您可以删除所有项目并重新绑定到新集合吗?

    jCarousel 文档陈述如下 通过传递回调函数 itemLoadCallback 作为配置选项 您可以动态地create li 内容项 jCarousel 包含一个方便的方法 add 可以将项目的索引传递给create以及要创建的项目的
  • 如何按特定月份/日期过滤日期数据框?

    所以我的代码如下 df Dates df Dates index month 11 我正在做一个测试 看看是否可以过滤月份 以便它只显示 11 月日期 但这不起作用 它给我以下错误 AttributeError Int64Index 对象没
  • 调用 POST 方法后 Spring 控制器返回 404

    我有一个从 JQuery post 调用的 Spring 控制器 当它被调用时 控制器的方法被调用并返回 但随后 Spring 在后台更改 URL 并调用服务器增益 服务器响应 404 我认为这是对 Spring 在处理 POST 方法后尝
  • spring 3上传很多文件

    是的 我们的客户想要上传多个文件 我们使用 spring 3 mvc 官方的例子是这样的 markup
  • 如何在 WinRT 应用程序中获取实际语言?

    是否有可能像 Windows Phone 一样获取操作系统的实际语言 我在用着CultureInfo CurrentCulture TwoLetterIsoString 但我总是收到 en 而不是正确的语言 即de就我而言 那么如何获取 W
  • 如何在 Meteor 中访问客户端 IP 地址? [复制]

    这个问题在这里已经有答案了 这似乎是一个非常基本的问题 没有一个优雅的解决方案 答案 如何从 1 服务器或 2 客户端访问客户端 远程 IP 地址 获取客户端IP 如果没有 http 请求 在函数中您应该能够通过以下方式获取 clientI
  • 变量变量

    如何在 for 循环内创建可变变量 这是循环 for counter 1 counter lt aantalZitjesBestellen counter 在这个循环中 我想在每次通过时创建一个变量 seat 但它必须像这样递增 第一次通过
  • Travis CI 忽略 MAVEN_OPTS?

    我的 Scala 项目 Maven 管理的 无法在 Travis 上构建 抛出一个GC overhead limit exceeded尽管在本地用相同的方法编译得很好 但仍然出错MAVEN OPTS Xmx3g XX MaxPermSize
  • ASP.NET 自定义控件 - 仅包含一次嵌入 CSS 引用的最佳方法是什么?

    问题 我将 CSS 文件嵌入到具有多个控件的自定义控件库中 我想为所有控件共享相同的 CSS 文件 无论给定表单上有多少个控件实例 当表单上有多个控件时 我希望在 ASP NET 页面的 HTML 标头中恰好有 1 个对 CSS 文件的引用
  • jQuery - 删除所有具有相似名称的类

    有没有更好的方法来做到这一点 element removeClass class 1 removeClass class 2 removeClass class 3 removeClass class 5 to removeClass cl
  • 为什么 @objc 枚举的描述与纯 Swift 枚举不同?

    考虑两个 Swift 枚举 enum Foo Int case bar objc enum Baz Int case qux 如果我要print each case对于这些枚举 我期望得到相同的结果 相反 我看到了一些意想不到的东西 pri
  • 在 32 位 Windows 上使用 NASM 在程序集中创建 exe 文件

    我正在用汇编语言编写一个 hello world 程序NASM在 32 位上Windows 7的 我的代码是 section text global main must be declared for linker ld main tell
  • 我应该如何类型提示一个也可以是无限的整数变量?

    搜索这个主题时我发现了以下内容 如何表示整数无穷大 我同意 Martijn Peeters 的观 点 即为int可能不是最好的想法 然而 这使得类型提示变得困难 假设以下代码 myvar 10 type int myvar math inf
  • ASP.NET MVC 2 中的验证实际上是如何工作的?

    我试图追踪为什么我的 ASP NET MVC 2 验证不起作用 但我找不到足够的关于它如何工作的信息来做到这一点 我已按照此步骤操作大卫 海登的有用文章这似乎是目前最好的文档 但实际上什么也没发生 当我提交到服务器时 我得到了验证 就像我从
  • 防止 Angular 中的多个 $http 请求。有没有更好的办法?

    我构建了一个有点复杂的方法来通过 http 返回资源 该方法返回一个承诺 然后检查我的本地缓存是否存在资源 如果是 它将返回缓存的资源 如果不是 它将发出 http 请求 这在资源被缓存后效果很好 但是我在加载时调用此方法的应用程序中有多个