如何删除ngrx中以前的存储状态?

Posted

技术标签:

【中文标题】如何删除ngrx中以前的存储状态?【英文标题】:How to delete previous states of store in ngrx? 【发布时间】:2018-04-08 22:32:18 【问题描述】:

据我所知,store 是一个状态列表,每个状态都可以直接访问其上一个或下一个状态。如果我有大量数据并且每个状态都太大而无法保存在每个状态中,则此列表保存在应用程序内存中。如何永久删除旧的存储对象以避免内存过剩?

此时我的代码如下所示:

export const REDUCERS = 
    login: loginReducer,
    register: registerReducer,
    profile: profileReducer,
    company: companyReducer,
    balance: balanceReducer

const SdkReducer = compose(storeLogger(), combineReducers)(REDUCERS);

export function reducer(state: any, action: any) 
    if(action.type === 'RESET_STORE')
        return undefined;
    

    return SdkReducer(state, action);

当调用“RESET_STORE”时,root reducer 返回“udefined”,但是,据我所知,仍然保存了 store 的旧状态,其中包含旧数据。我想永久删除它。释放一些内存。

【问题讨论】:

垃圾收集由网络世界中的浏览器处理。作为 Web 应用程序开发人员,您的工作是确保您不做任何阻止浏览器垃圾收集的事情,例如保留对旧数据的引用,以便您的浏览器无法收集它。在这种情况下,您在某些地方依赖于一个框架来为您执行此操作,您需要希望他们做对了,或者如果您认为他们搞砸了,请查看那里的代码并弄清楚发生了什么。 ngrx 非常好,它们实际上并没有保存所有以前的状态,这是对它的错误描述。 再次感谢布莱恩。您的解释帮助我了解如何保存旧状态。 【参考方案1】:

您对ngrx 的理解有些偏离。 ngrx 实际上并没有保留所有以前的状态。 ngrx 背后的想法是,如果你做对了,相同的动作和有效负载集应该总是产生相同的应用程序状态,从这个意义上说,动作和有效负载的记录是你的应用程序状态在每个时间点的完整历史记录.

您无需按照您的描述进行操作。如果您遇到内存问题,则可能是无意中在某处造成了泄漏。

【讨论】:

非常感谢您的明确回复。这对我帮助很大。【参考方案2】:

您根本不必这样做。这是由浏览器的垃圾收集器完成的。

只要确保你没有在某个地方引用你以前的状态。

例如,如果您创建一个中间件,将之前的每个状态都推送到一个数组中,那么它们将永远不会被清理,并且您的内存消耗会随着时间的推移而增加而不会减少。

【讨论】:

【参考方案3】:
const initialState = appReducer(, )

const rootReducer = (state, action) => 
 if (action.type === 'RESET_STORE') 
   state = initialState
 
 return appReducer(state, action)

【讨论】:

感谢您的快速回答。但据我所知,这只会重置当前状态,旧数据仍将保存在内存中。我想删除不必要的数据,而不仅仅是重置当前状态。

以上是关于如何删除ngrx中以前的存储状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 RxJS combineLatest 中删除瞬态事件与 NGRX 存储源 observable

Angular+ngrx:如何在路由器 url 遍历中保持存储状态?

@ngrx 在递归使用智能组件时从存储中选择特定的状态片

如何从 Kafka 全局状态存储中删除记录?

在 Oracle 中删除了表后,又新倒入了表 怎么恢复到以前未删除之前的状态? 急啊!!!!!!!

Core Data:如何删除和重建数据存储?