在AngularJS(1.x)中根据状态变化清理工厂的最佳实践

在AngularJS(1.x)中根据状态变化清理工厂的最佳实践,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我有一个非常大的应用程序,可以跨几十个项目查询大量数据(作为一项要求)。每个项目跟踪来自其他项目的不同数据,每个项目都有自己的父状态/解析(使用ui路由器)。我可以通过各种技巧在单个页面上保持较低的数据利用率,但我想知道的是,在工厂单例中清除不再需要的状态转换数据的最佳实践和最有效的方法是什么 本质上,我需要在状态转换时清空当前状态未使用的所有其他单例,以便浏览器不会因数据大小而溢出 作为一种解决方法,我目前正在通过我所有的工厂传递数据,而不是将其直接存储在它的原始工厂中。相反,我是在一种faç

我有一个非常大的应用程序,可以跨几十个项目查询大量数据(作为一项要求)。每个项目跟踪来自其他项目的不同数据,每个项目都有自己的父状态/解析(使用ui路由器)。我可以通过各种技巧在单个页面上保持较低的数据利用率,但我想知道的是,在工厂单例中清除不再需要的状态转换数据的最佳实践和最有效的方法是什么

本质上,我需要在状态转换时清空当前状态未使用的所有其他单例,以便浏览器不会因数据大小而溢出

作为一种解决方法,我目前正在通过我所有的工厂传递数据,而不是将其直接存储在它的原始工厂中。相反,我是在一种façade模式中解析的,该模式查询来自不同数据定义工厂的数据,并将所有解析的数据路由到单个全局存储工厂,以供类似这样的视图指令使用

angular.module('someModule', [])
.config(function($stateProvider){
   $stateProvider
   .state('state1', {
      resolve: {state1Data: function(facadeFactory){return facadeFactory.setState1()}}
   })
   .state('state2', {
      resolve: {state2Data: function(facadeFactory){return facadeFactory.setState2()}}
   });
})
.factory('facadeFactory', function facadeFactory($q, singleStorageFactory, dataSource1, dataSource2, dataSource3, dataSource4){
   var factory = {};
   factory.setState1 = function(){
      var dfd = $q.defer();
      dataSource1.getAllData()
      .then(function(result){ return dataSource2.getAllData(result);})
      .then(function(result){ return singleStorageFactory.setData(result);})
      .then(function(){dfd.resolve(true);});
      return dfd.promise;
   }

   factory.setState2 = function(){
      var dfd = $q.defer();
      dataSource3.getAllData()
      .then(function(result){ return dataSource4.getAllData(result);})
      .then(function(result){ return singleStorageFactory.setData(result);})
      .then(function(){dfd.resolve(true);});
      return dfd.promise;
   }
   return factory;
})
.factory('dataSource1', function dataSource1(){
   var factory = {};
   factory.dataDef = {
      name: "list1",
      cols: ['col1','col2','col3'],
      thisKey: 'col1'
   };
   factory.getAllData = function(currentData){
      // get data > add it to currentData if it exists > return aggregated data
   };
   return factory;
})
// dataSource2, dataSource3, and dataSource4 are same as dataSource1 albeit with different data definition
.factory('singleStorageFactory', function singleStorageFactory($q){
     var factory = {};
     factory.data;
     factory.setData = function(data){
          var dfd = $q.defer();
          factory.data = data;
          dfd.resolve(factory.data);
          return dfd.promise;
     };
     return factory;
});
我将单个数据定义存储在他们自己的工厂中,这是由于一些其他要求,这些要求涉及将项目中的部分和部分数据聚合到某种主跟踪器中,但这既不存在也不存在


总之,这是防止大型数据集在状态转换时崩溃浏览器的正确方法,还是我忽略了AngularJS如何从未使用的单例中收集垃圾

我们在我的办公室考虑过这一点,但找不到任何保存数据的真正方法,尤其是在数据很大的情况下

我们的结果是每5-10分钟刷新一次页面,而这并不是100%的实时数据,这对我们来说很有用

$timeout(reload, 300000);// don't forget to inject $timeout in your controller

reload(){
$route.reload(); // don't forget to inject $route in your controller
}

使用LRU缓存,例如.BTW
facadeFactory.State[12]
方法,不需要为解析器函数制造承诺,因为它们同时接受承诺和同步变量。@georgeawg谢谢。我正在调查$cacheFactory,但我不确定它是否能解决手头的问题;我会做更多的实验。@georgeawg我对你的反模式评论很好奇;解析需要返回一个对象,但承诺链实际上并不直接返回任何内容b/c它将返回值存储回singleStorageFactory,因此由于数据大小问题,在状态更改时将覆盖该值。延迟将真值包装在对象中以推动解决,但如果我要删除延迟,我将如何向解决发出信号,表明我在setState1中的承诺链已完成?阅读。如前所述,如果父异步函数返回被拒绝的承诺,则您的
$q.deferred
s将挂起。