首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AngularJS高级缓存技术

AngularJS高级缓存技术
EN

Stack Overflow用户
提问于 2012-10-22 13:11:19
回答 1查看 6.2K关注 0票数 2

我读过关于$cacheFactory的文章,当涉及到$http时,它通过url缓存所有东西。现在,我有一些更复杂的需求:

  1. 有某种物品(用户、物品等)的清单。此列表从服务器中提取并缓存到缓存中。
  2. 当应用程序请求单个项目时,它会进入缓存,并且: 2.1。如果存在具有已提供密钥的项,则从缓存中提取 2.2。如果缓存列表中不存在项,则它将转到服务器,当从服务器获得响应时,将该项放到缓存列表中,因此下次从缓存中提取该项时
  3. 当项被保存到数据库中时,它会得到一些键(自动编号或guid),并且当服务器解析响应时: 3.1。如果项已存在于缓存中,则项将与服务器数据合并/扩展。 3.2。如果缓存中不存在项,则只需将其添加到列表中即可。
  4. 应用程序应该检查(每10秒)列表中是否有一些新的/更新的/删除的项目(由其他用户创建)并刷新它(不会对当前用户的工作产生重大影响)

现在,1-3是容易的,4应该手动启动或放入一些计时器.

当您有无限数量的查询组合时,更复杂的是如何处理搜索。

我知道如何开发所有这些,但我想知道是否已经为AngularJs或一般的javascript和ajax调用提供了经过验证的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 18:06:51

可能需要创建自己的服务才能做到这一点。

类似于(psuedo代码,因为我没有服务器来支持这一切).

代码语言:javascript
运行
复制
app.factory('andrejsSuperAwesomeService', ['$cacheFactory', '$http', function($cacheFactory, $http) {

   //get your cache ready.
   var userCache = $cacheFactory('users');

   // start an interval to check for data.
   // TODO: add a public function to turn this on and off.
   setInterval(function(){
       //check for changes to the data.
       $http.get('/Get/New/User/Changes')
            .success(function(changes) {
                 if(!changes) return;
                 //we'll assume we get some collection of changes back,
                 // with some change type and the user data.
                 for(var i = 0; i < changes.length; i++) {
                      var change = changes[i];
                      switch(change.changeType) {
                          case 'delete':
                             // okay just remove the deleted ones.
                             userCache.remove(change.user.id);
                             break;
                          case 'addUpdate':
                             // if it's added or updated, let's just 
                             // remove and re-add it, because we can't know what
                             // we already have or don't have.
                             userCache.remove(change.user.id);
                             userCache.put(chnage.user.id, change.user);
                             break;
                      }
                 }
            });
   }, 10000); // every 10 secs
   return {
      users: {
           //a function to get a user. 
           get: function(userId, callback) {
               var user = userCache.get(userId);

               if(!user) {
                     //the user is not in the cache so let's get it.
                     $http.get('/Uri/To/Get/A/User?userId=' + userId)
                        .success(function(data) {
                           //great, put it in the cache and callback.
                           userCache.put(userId, data);
                           if(callback) callback(data);
                        });
               } else {
                     //we already have the user, callback.
                     if(callback) callback(data);
               }
           }
      }
   };
});

然后在控制器中注入服务并按如下方式使用:

代码语言:javascript
运行
复制
andrejsSuperAwesomeService.users.get(12345, function(user) {
       //do something with user here.
       alert(user.name + ' is a naughty user!');
});
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13012216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档