我有一个Web应用程序,它从websocket接收更新,例如每秒100条消息。
我正在使用不可变的帮助程序并尝试过
const parentIndex = action.payload.data.findIndex( i => i.id===action.id)
if(parentIndex !== -1) {
const childIndex = action.payload.data[parentIndex].child.findIndex(c=>i.id===action.childId)
if(child !== -1) {
const lastChildIndex = action.payload.data[parentIndex].child[childIndex].lastChild.findIndex(l=>l.id===action.lastChildId)
return lastChildIndex=== -1
? update(state, { // insert
data: {
[parentIndex]: {
child: {
[childIndex]: {
lastChild: {
$push: [{
parentId: action.id,
childId: action.childId,
lastChildId: action.lastChildId,
price: action.payload.price
}]
}
}
}
}
}
})
: update(state, { // update
data: {
[parentIndex]: {
child: {
[childIndex]: {
lastChild: {
[lastChildIndex]:{
price: { $set: action.payload.price},
isUpdated: { $set: true}
}
}
}
}
}
}
})
}
}
示例数据:
data = [
{
parentId: 123,
itemName: 'John Doe',
child: {
childId: 456,
childName: 'I am child one',
lastChild: {
lastChildId: 789,
price: 143
}
}
},
{
parentId: 321,
itemName: 'John Wick',
child: {
childId: 654,
childName: 'I am child wick',
lastChild: {
lastChildId: 987,
price: 44
}
}
}
]
这似乎至少可以处理5个数据数组,但是当数据超过15个时,浏览器似乎运行缓慢,内存泄漏并很快崩溃。.
每次有消息推送到应用程序时查找索引 会杀死浏览器。
我正在使用redux-thunk作为中间件。
如果您可以向我推荐一些可以更快地更新/插入,更完美且无缝的东西。那太酷了。
答案 0 :(得分:2)
首先解决这个问题:
一个从websocket接收更新的Web应用程序,例如每秒100条消息
您应throttle或将其反跳,以免更新每条消息的状态。或者,如果可以,减少邮件数量。或两者兼有。
一旦您解决了这个问题,该应用程序可能应该可以正常运行。但是您仍然可以进行一些改进:
执行此操作:
{
payload: {
parentId: 123,
childId: 321,
lastChildId: 555,
price: 50
}
}
您的减速器将如下所示:
const { parentId, childId, lastChildId } = action.payload;
const childItem = state[parentId][childId][lastChildId];
const newState = {...state}
newState[parentId][childId][lastChildId] = {...childItem, ...action.payload};
return newState;
如果我知道像我在这里一样需要查找特定项目,我选择一个映射而不是一个数组。
答案 1 :(得分:0)
放弃数组并建立这样的商店如何呢?
{
id: {
childId:{...data,etc..},
childId2:{},
...
},
id2: {...},
...
}
您可以使用store.data[id].child[index]
简而言之就是
if(store.data[parentIndex]&&store.data[parentIndex][childIndex]){
!!!
}else{
:(((
}
答案 2 :(得分:0)
三个观察结果:
immutable-helper
进行不可变的更新。它更加简单易用。更好的是使用内置的Immer的新Redux Starter Kit package。