使用 $resource 承诺模式缓存数据

2023-12-19

假设我的服务从 $resource get 返回一个承诺,我想知道这是否是缓存数据的正确方法。在此示例中,点击后退箭头并返回搜索结果后,我不想再次查询网络服务器,因为我已经有了它们。这是处理这种情况的正确模式吗?下面的示例是查询 Flixter(烂番茄)Api。

归结代码:

控制器:

function SearchCtrl($scope, $route, $routeParams, $location, DataService) {
    DataService.search($routeParams.q).then(function(data){
       $scope.movies = data.movies;
    });
}

Service:

angular.module('myApp.services', []).
 factory('DataService', ['$q', '$rootScope', 'JsonService', function ($q, $rootScope, JsonService) {

  var movie = {};
  var searchResults = {};
  var searchq = '';
  var service = {

    search: function(q) {

        var d = $q.defer();
        // checking search query, if is the same as the last one, 
        //resolve the results since we already have them and don't call service
        // IS THIS THE CORRECT PATTERN
        if (q==searchq) {
           d.resolve(searchResults);              
        } else {
          // returns a $resource with defined getdata
          JsonService.search.movieSearch(q, 20, 1).getdata(function(data){
            searchResults = data;
            searchq = q;
            d.resolve(searchResults);
          });
        }
       return d.promise;

    },
      getSearchResults: function() {
        return searchResults;
      }
 };

 return service;
 }]);

我无法提供有效的示例,因为它会暴露我的 API 密钥。


我伪造了实际的 ajax 请求,但我认为一般的想法应该适用,你可以看到完整演示在这里 http://jsfiddle.net/dbPFa/

这是控制器,它只是执行搜索然后设置结果:

myApp.controller('MyCtrl', function($scope, DataService) {
     $scope.search = function(){
          DataService
              .search($scope.q)
              .then(function(response){
                  $scope.fromCache = response.fromCache;
                  $scope.results = response.results;
              });
      };
});

在 DataService 中,我只是将结果保存到一个关闭查询的对象中。它很简单,但希望能帮助您入门。如果你想要类似的东西,你可以将它保存在 html5 存储或其他东西中。

您需要在此处输入实际的 ajax 调用,但原则仍然存在。

myApp.factory('DataService', function($q){
      var resultsCache = {};
      return {
          search: function(query){
              var deferred = $q.defer();
              if (resultsCache[query]) {
                  resultsCache[query].fromCache = true;
              }
              else {
                  resultsCache[query] = {results: [{name: 'result one'}, {name: 'result two'}]};
              }
              deferred.resolve(resultsCache[query]);
              return deferred.promise;
          }
      };
});

希望有帮助

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

使用 $resource 承诺模式缓存数据 的相关文章

  • 使用 AngularJS 多部分表单数据将文件上传到 Google Cloud Storage

    我正在尝试使用 AngularJS 中指定的多部分方法将图像文件上传到 Google Cloud Storagehttps cloud google com storage docs json api v1 how tos upload m
  • AngularJS - 获取已定义路由的列表 - $routeProvider

    我正在尝试实施named routes 所以我不必写整个路径 经常改变 我想我可以编写一个服务来返回定义的路由列表和一个将对象转换为路由的过滤器 使用示例如下所示 a Click here a 假设我已将 name detail 添加到我的
  • 使用 jasmine 在 angularJS 中注入服务来测试控制器

    我想了解如何使用 jasmine 和 angularJS 测试我的代码 我编写了一个带有控制器和注入服务的测试项目 现在我想测试控制器并尝试模拟注入的服务 但我没有找到一种方法来测试我的控制器的 到达 功能 这是我的jsfiddle htt
  • Angular UI select:从远程服务获取数据

    我正在使用角度用户界面选择 https github com angular ui ui select https github com angular ui ui select 我查看了演示的可用位置这个笨蛋 http plnkr co
  • Angular 模态对话框最佳实践

    与不具有动态内容的对话框相比 创建具有动态内容的模式对话框的最佳实践是什么 例如 我们有一些模式表单接受表单元素列表 并具有提交 取消功能 此外 还有一些模式对话框仅显示确认 确定类型的操作 我见过很多人说对话框应该是传递到控制器的服务 但
  • 如何知道在Angular JS中选择了哪个元素

    我制作了多个选定的弹出窗口 用户可以在其中选择多个值 我想在屏幕上打印所有选定的值或获取一个对象 其中包含用户选择的所有元素 我将换句话说 在我的演示中 我在屏幕上有一个按钮 单击按钮时 我会打开一个弹出窗口 其中有多个选定的元素我想获取用
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • 嵌套指令 - 无法将参数从 Angularjs 中的子指令传递到控制器方法

    我在 angularjs 中的嵌套指令方面遇到了一些问题 我想从另一个指令中的指令调用控制器方法 并尝试将参数传递给它 但是它们是未定义的 我尝试使用下面的 selected html 中的三个参数来调用remove 在我引入父指令 tel
  • 如何在 AngularJS 中设置和使用 $anchorScroll 的 yOffset 属性

    我用 anchorScroll AngularJS 中的服务 效果很好 但我在顶部有一个固定的导航栏 滚动位置总是 x 像素远 现在在 anchorScroll文档 https docs angularjs org api ng servi
  • 如何获取 ng-repeat 中的前一项?

    我有一个模板 仅当当前项目与前一个项目有一些不同的字段时 我才想生成一些 HTML 如何访问 ng repeat 中的前一项 你可以做类似的事情 div ul li div class title index content title c
  • AngularJS:遍历嵌套数组

    我正在使用具有以下结构的嵌套数组 scope items attr1 val1 attr2 val2 items attr1 val1 attr2 val2 items 这进入一个ng repeat with ng include像这样 d
  • 如何理解 Angular JS 中的控制台错误消息?有什么工具吗?

    我是 Angular JS 的新手 我的第一个问题是如何理解 Angular JS 中控制台的错误消息 我编写了这段用于匹配密码的代码片段 它在控制台上抛出错误 但它工作正常 它是有线的 我无法从这些控制台消息中理解任何内容 谁能指出我为什
  • 当您只能访问模块变量时注入模块

    假设你有一个 var app angular module Mod1 现在您需要向该模块注入其他内容 但您无法更改该行 您只能访问app多变的 所以这行不通 对吧 var mod2 angular module mod2 factory m
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 如何将 .env 文件变量传递给 webpack 配置?

    我是 webpack 的新手 几乎完成了所有构建部分 但现在的问题是我想将环境变量从 env 文件传递 到 webpack 配置 以便我可以通过以下方式将该变量传递到我的构建文件webpack DefinePlugin plugin 目前我
  • 使用 Angular 将焦点捕获在 html 容器中

    我正在构建一个可访问的网站并尝试管理焦点 我需要打开一个模式 然后将焦点放在模式中的第一个元素上 然后捕获焦点 直到模式关闭 取消 或 接受 HTML a href Open Modal a div h3 Terms of Service
  • 将表单传递给 AngularJS 组件进行验证

    我正在将旧代码库迁移到 AngularJS 1 5 所推广的新组件架构 我在对较大的表单执行此操作时遇到了问题 传统上 我会附加表单验证 如下所示
  • angularjs - 将对象数组(JSON 数据)发布到 PHP 页面

    我的 JSON 数据的示例如下 scope a email keval gmail permissions upload 1 edit 1 email new aa permissions upload 1 edit 1 我想发布同样的内容
  • 无法使用键盘导航特定高度的 Angular-ui Bootstrap Typeahead

    所以 我认为这更像是一个引导程序问题 而不是 Angular ui 但我在这个问题上花了 2 个晚上 但我找不到隧道尽头的光明 这是笨蛋 http plnkr co edit n39LVjbHQzmcwGkk2dR1 p preview h
  • Angular UI-Router:多个 URL 到单一状态

    我已经开始使用 Angular 的 ui router 并且我正在尝试弄清楚如何让多个 URL 引用单个状态 例如 orgs 12354 overview retyrns the same pages as org overview 我的

随机推荐

  • 如何将 2 个 zip 文件合并为 1 个?

    我有 2 个 zip 文件 zip1 和 zip2 我需要将这些文件合并为一个 我该如何解决 我知道我可以修复它 将 ZIP1 解压到临时文件夹 然后将其添加到 zip2 但我认为效率很低 更快的方法是什么 我在用着System IO Co
  • Android:创建自定义资源类

    Android 上的 R 类有其局限性 您不能动态使用资源来加载音频 图片或其他内容 例如 如果您不想为选定的对象加载一组音频文件 则您不能执行以下操作 R raw string upon choosen object 我是 android
  • Jenkins 签出 GIT 项目失败,权限被拒绝致命:无法分叉

    我有一个 Freestyle Jenkins 项目 它使用 bitbucket 作为 SCM 使用 ssh 作为协议和私钥 不是用户 密码 当我在 master 上构建项目时 它失败并显示以下堆栈跟踪 而它在代理上运行良好 注意错误提到 s
  • X-Frame-Options 禁止 Facebook 应用程序错误

    我正在构建一个 Facebook 应用程序 目前它处于沙盒模式 我的代码 索引 php
  • Slick 3.0如何更新变量列列表,哪个数字只有在运行时才知道

    是否可以更新变量列列表 其中的数字仅在运行时由 slick 3 0 知道 下面是我想要做的示例 不会编译 var q Query UserTable UserTable TableElementType Seq userTable var
  • 隐式参数和函数

    我在考虑 Haskell GHC 中的隐式参数时遇到问题 我有一个函数f 假设隐式参数x 并希望通过应用将其封装在上下文中f to g f x Int gt Int gt Int f n n x g Int gt Int gt Int gt
  • 如何用范围填充可变参数?

    填充可变参数的正确方法是什么 我的尝试看起来像自行车 首先我构建范围然后我将其转换为列表然后到 intarray然后传播它 m getColumns count count 35 toList toIntArray 其中 getColumn
  • 将字符串插入工作表会导致插入数字

    在我的 Google Apps 脚本中 我在电子表格中添加了一行 在附加的这一行中 我尝试插入一个值 0102 的字符串 但是插入时它会转换为数字 102 有没有什么方法可以使用 Google Apps 脚本将值插入到工作表中 而不会格式化
  • Ubuntu 自动从 Github 存储库中拉取

    我在我的服务器上安装了 git 但我希望每当我推送本地所做的更改时它都会从我的 github 存储库中提取 我研究过钩子 但它非常令人困惑 而且我找不到任何教程 有谁知道这是怎么做到的吗 我希望我的服务器在每次提交后从存储库中提取 这看起来
  • JPA 和 PostgreSQL 与 GenerationType.IDENTITY

    我有关于 Postgres 和 GenerationType Identity 与 Sequence 的问题 在这个例子中 Id SequenceGenerator name mytable id seq sequenceName myta
  • PySpark Worker 中 rdd.collect() 上的 ModuleNotFoundError

    我正在 python 中运行 Apache Spark 程序 并且收到一个我无法理解且无法开始调试的错误 我有一个驱动程序 它在名为 hound py 的文件中定义了一个名为 hound 的函数 在同一目录中 我有一个名为 hound ba
  • PHP Websocket 在测试中验证用户身份(传递会话 cookie)

    我正在尝试测试一个场景 一方面 匿名用户应立即断开与 Websocket 连接的连接 另一方面 经过身份验证的用户应保持 Websocket 连接 第一种情况很容易使用下面的代码进行测试 身份验证过程不起作用 对于会话存储 我将 Cooki
  • 具有多种格式的 Moshi LocalDateTime 适配器

    默认情况下 ThreeTenABP LocalDateTime 转换为 date day 10 month 4 year 2018 time hour 3 minute 34 nano 115000000 second 18 我可以编写一个
  • Magento 客户/会话不工作

    这个问题首先被意识到是因为前端的订单历史页面 sales order history 只显示一条短消息 您没有下订单 经过一番调试 发现问题出在这个函数上 Mage getSingleton customer session 它不会返回包含
  • 为什么 Plastic SCM 不断询问我是否信任复制服务器的证书?

    每次运行类似命令时 我开始收到以下提示cm status cs 630 rep MyServer repserver ssl
  • 出现“类型错误...$(...).modal 不是函数

    我正在尝试使用引导模式创建和编辑用户更新注释的函数 在 REACT 项目中 但这是我得到的错误 Uncaught in promise TypeError jquery WEBPACK IMPORTED MODULE 1 default m
  • 查找数组中所有元素都具有特定值的文档

    这基本上是一个简单的问题 但我找不到它的查询函数 示例集合 id 1 foo bar 9 bar 16 id 2 foo bar 9 bar 9 bar 9 示例输出 id 2 foo bar 9 bar 9 bar 9 因为这是唯一一个每
  • python pyplot连接点

    我正在使用一组点制作 pyplot 图 plt plot range 0 10 dictionary key bo 这按照我的预期正确地绘制了点 但是我也希望在这些点之间绘制一条线 我找不到用 pyplot 来做到这一点的方法 我认为这是微
  • Oracle 中完全外连接的奇怪行为 - 如何解释?

    我注意到 Oracle 11 中 FULL OUTER JOIN 的奇怪行为 我正在连接 HR 模式中的表 特别是 EMPLOYEES 和 DEPARTMENTS 例如 以下查询返回 123 行 SELECT FROM employees
  • 使用 $resource 承诺模式缓存数据

    假设我的服务从 resource get 返回一个承诺 我想知道这是否是缓存数据的正确方法 在此示例中 点击后退箭头并返回搜索结果后 我不想再次查询网络服务器 因为我已经有了它们 这是处理这种情况的正确模式吗 下面的示例是查询 Flixte