有同事在使用用例管理平台的时候反馈到,他跟另外一个同事一起执行某条用例,但是因为用例内容非常多,所以他的做法是仅展开自己需要执行的部分用例,其他的用例都做收起处理。但是这个做法,另外一个同事就不愿意了,因为这个收起展开的操作,也会同步到他的界面上,导致他根本没有办法执行他的用例。
idea
所以就上面的问题,想着有没有可能类似并没有涉及到内容,或者顺序的变化的操作,可以把这类的操作给过滤掉,而只传递关键数据变更的操作。
我们先看下 原本的逻辑是如何的
/**
* 发送补丁数据
*/
sendPatch = (diff) => {
this.sendMessage("1" + JSON.stringify({ case: this.getAllData(), patch: [diff], }))
}
我们可以看到,一旦内容变化,计算出diff数据以后,就直接通过websocket发送给到服务端去了,所以我们可以想的就是处理下这里的diff内容, 过滤掉无需要传递的数据。 那我们再来看看diff的数据是什么样的。
[
{
"op": "replace",
"path": "/root/children/0/children/0/data/layout_right_offset/x",
"value": -33
}
]
是如上的数组的数据,就比如说上述的操作其实就是把节点的x坐标做了偏移处理,像这种数据其实就可以不需要去传递的, 所以我们可以过滤掉这样子数据,通过path的结尾来判断,因为 op以及value并不是有确定性。
解决
如果在线编辑用户是大于1的情况下,就过滤掉一些非更新数据的diff内容。
/**
* 发送补丁数据
*/
sendPatch = (diff) => {
if (this.state.editUsers.length > 1) {
// 如果说编辑的人超过了1人的话 部分的样式修改 ,需要把它过滤掉
diff = diff.filter(item => {
return !endsWith(item.path, "layout") &&
!endsWith(item.path, "layout_right_offset") &&
!endsWith(item.path, "expandState") &&
!endsWith(item.path, "layout_right_offset/y") &&
!endsWith(item.path, "layout_right_offset/x")
})
}
this.sendMessage("1" + JSON.stringify({ case: this.getAllData(), patch: [diff], }))
}
结果如上。