Улучшение механизма синхронизации
This commit is contained in:
@@ -401,7 +401,14 @@ class ServerStorage extends Vue {
|
|||||||
|
|
||||||
let newRecent = {};
|
let newRecent = {};
|
||||||
if (recentDelta && recentDelta.data) {
|
if (recentDelta && recentDelta.data) {
|
||||||
|
if (recentDelta.data.diff) {
|
||||||
|
newRecent = recent.data;
|
||||||
|
const key = recentDelta.data.diff.key;
|
||||||
|
if (newRecent[key])
|
||||||
|
newRecent[key] = utils.applyObjDiff(newRecent[key], recentDelta.data.diff);
|
||||||
|
} else {
|
||||||
newRecent = Object.assign(recent.data, recentDelta.data);
|
newRecent = Object.assign(recent.data, recentDelta.data);
|
||||||
|
}
|
||||||
this.recentDelta = recentDelta.data;
|
this.recentDelta = recentDelta.data;
|
||||||
} else {
|
} else {
|
||||||
newRecent = recent.data;
|
newRecent = recent.data;
|
||||||
@@ -432,7 +439,6 @@ class ServerStorage extends Vue {
|
|||||||
const bm = bookManager;
|
const bm = bookManager;
|
||||||
|
|
||||||
//вычисление критерия сохранения целиком
|
//вычисление критерия сохранения целиком
|
||||||
let forceSaveRecent = false;
|
|
||||||
if (!this.sameKeyCount)
|
if (!this.sameKeyCount)
|
||||||
this.sameKeyCount = 0;
|
this.sameKeyCount = 0;
|
||||||
if (this.prevItemKey == itemKey) {
|
if (this.prevItemKey == itemKey) {
|
||||||
@@ -441,11 +447,24 @@ class ServerStorage extends Vue {
|
|||||||
this.sameKeyCount = 0;
|
this.sameKeyCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
forceSaveRecent = this.sameKeyCount > 5 && (Object.keys(this.recentDelta).length > 1);
|
const l = Object.keys(this.recentDelta).length - (1*(!!this.recentDelta.diff));
|
||||||
|
this.makeDeltaDiff = (l == 1 && this.prevItemKey == itemKey ? this.makeDeltaDiff : false);
|
||||||
|
const forceSaveRecent = l > 10 || (this.sameKeyCount > 5 && (l > 1)) || (l == 1 && this.sameKeyCount > 10 && !this.makeDeltaDiff);
|
||||||
|
|
||||||
this.sameKeyCount = (!forceSaveRecent ? this.sameKeyCount : 0);
|
this.sameKeyCount = (!forceSaveRecent ? this.sameKeyCount : 0);
|
||||||
this.prevItemKey = itemKey;
|
this.prevItemKey = itemKey;
|
||||||
|
|
||||||
|
//дифф от дельты для уменьшения размера передаваемых данных в частном случае
|
||||||
|
if (this.makeDeltaDiff) {
|
||||||
|
this.recentDelta.diff = utils.getObjDiff(this.prevSavedItem, bm.recent[itemKey]);
|
||||||
|
this.recentDelta.diff.key = itemKey;
|
||||||
|
delete this.recentDelta[itemKey];
|
||||||
|
} else if (this.recentDelta.diff) {
|
||||||
|
const key = this.recentDelta.diff.key;
|
||||||
|
this.recentDelta[key] = utils.applyObjDiff(this.prevSavedItem, this.recentDelta.diff);
|
||||||
|
delete this.recentDelta.diff;
|
||||||
|
}
|
||||||
|
|
||||||
this.savingRecent = true;
|
this.savingRecent = true;
|
||||||
try {
|
try {
|
||||||
if (forceSaveRecent) {//сохраняем recent целиком
|
if (forceSaveRecent) {//сохраняем recent целиком
|
||||||
@@ -467,7 +486,10 @@ class ServerStorage extends Vue {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (result.state == 'success') {
|
} else if (result.state == 'success') {
|
||||||
this.recentDelta = null;
|
this.makeDeltaDiff = true;
|
||||||
|
this.prevSavedItem = _.cloneDeep(bm.recent[itemKey]);
|
||||||
|
|
||||||
|
this.recentDelta = {};
|
||||||
await bm.setRecentRev(bm.recentRev + 1);
|
await bm.setRecentRev(bm.recentRev + 1);
|
||||||
await bm.setRecentDeltaRev(bm.recentDeltaRev + 1);
|
await bm.setRecentDeltaRev(bm.recentDeltaRev + 1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user