Javascript 代价高昂的不可变操作
我有一个处于redux状态的数据,它有大约100000条json记录(每条记录有大约8个键值对) 我在客户端编写了一个逻辑,每30秒刷新一次数据(每30秒我向服务器打一个电话,获取要删除的记录和要添加的记录) 我在我的reducer函数中进行了这个处理,为此我编写了一个方法“mergeUpdates”,它迭代state.data对象来标识要删除的内容和要插入的内容 我使用了Javascript 代价高昂的不可变操作,javascript,reactjs,redux,immutability,Javascript,Reactjs,Redux,Immutability,我有一个处于redux状态的数据,它有大约100000条json记录(每条记录有大约8个键值对) 我在客户端编写了一个逻辑,每30秒刷新一次数据(每30秒我向服务器打一个电话,获取要删除的记录和要添加的记录) 我在我的reducer函数中进行了这个处理,为此我编写了一个方法“mergeUpdates”,它迭代state.data对象来标识要删除的内容和要插入的内容 我使用了fromJs(state.data).toJsfrom immutable来克隆state.data并进行更新(state.
fromJs(state.data).toJs
from immutable来克隆state.data并进行更新(state.data不是不可变的)。但这次克隆的成本非常高(100000条记录大约需要2秒钟),因此我删除了克隆并开始修改state.data本身,这导致了“Assignment to function parameter”lint错误,因为我正在修改传递给函数的数据
initialState = {
data: {}
}
doSomething(state, change) {
// iterates on state and updates state
state = doSomethingElse();
return state;
}
mergeUpdates(state, change) {
// some logic
state = doSomething(state, change)
// some more logic
return state;
}
export default function (state=initialState, action) {
switch (action.type) {
case REFRESH: {
return mergeUpdates(state.data, action.data)
}
}
}
处理这种情况的最佳实践是什么?我应该在“mergeUpdates”和“doSomething”方法中将状态分配给一个新引用并返回一个新引用,还是将状态中的数据设置为不可变的或其他什么
例如:这被认为是一种好的做法吗
doSomething(state, change) {
let newState = state;
// process change and return newState
return newState;
}
mergeUpdates(state, change) {
let newState = state;
// apply change on newState
newState = doSomething(newState, change);
// return newState
return newState;
}
Redux本身并不强制用户使用普通对象进行状态管理。您可以使用immutable对象来存储数据,您需要做的唯一一件事就是像上面所做的那样,通过fromJS重新初始化全新的状态。
此外,immutable必须在整个应用程序中使用。实际上,如果数据结构不复杂,而不是繁琐的不可变的,我建议您使用扩展运算符来修改数据。(对我来说,树下超过3层是很复杂的) Redux本身并不强制用户使用普通对象进行状态管理。您可以使用immutable对象来存储数据,您需要做的唯一一件事就是像上面所做的那样,通过fromJS重新初始化全新的状态。
此外,immutable必须在整个应用程序中使用。实际上,如果数据结构不复杂,而不是繁琐的不可变的,我建议您使用扩展运算符来修改数据。(对我来说,树下超过3层是很复杂的) 应该尽量避免使用Immutable.js的
toJS()
和fromJS()
函数。根据作者李·拜伦的说法
我建议找一个不同的方法。一些建议:
- 如果您的数据已经在Immutable.js中,请使用它提供的其他函数来帮助更新该数据(例如
)Map.WithTranslations()
- 如果该数据不在Immutable.js中,或者您希望避免使用它,那么您可能需要查看,其中一些是专门用于帮助将新值合并到现有数据结构中的
toJS()
和fromJS()
函数。根据作者李·拜伦的说法
我建议找一个不同的方法。一些建议:
- 如果您的数据已经在Immutable.js中,请使用它提供的其他函数来帮助更新该数据(例如
)Map.WithTranslations()
- 如果该数据不在Immutable.js中,或者您希望避免使用它,那么您可能需要查看,其中一些是专门用于帮助将新值合并到现有数据结构中的