Работа над saveRecent

This commit is contained in:
Book Pauk
2019-09-07 16:39:29 +07:00
parent a8abd5d427
commit a1f4a83e72
2 changed files with 64 additions and 9 deletions

View File

@@ -345,8 +345,8 @@ class ServerStorage extends Vue {
}
}
if (force || revs.items.recentDiff.rev != oldRecentDiffRev || revs.items.recent.rev != oldRecentRev) {
let recent = null;
let recent = null;
if (force || revs.items.recent.rev != oldRecentRev || revs.items.recentDiff.rev != oldRecentDiffRev) {
try {
recent = await this.storageGet({recent: {}, recentDiff: {}});
} catch(e) {
@@ -361,17 +361,22 @@ class ServerStorage extends Vue {
if (recent.rev == 0)
recent.data = {};
this.oldRecent = _.cloneDeep(recent.data);
let newRecent = {};
if (recentDiff && recentDiff.data) {
newRecent = utils.applyObjDiff(recent.data, recentDiff.data);
this.recentDiff = _.cloneDeep(recentDiff.data);
if (!utils.isObjDiff(this.recentDiff))
this.recentDiff = null;
} else {
newRecent = recent.data;
this.recentDiff = null;
}
await bookManager.setRecent(newRecent);
await bookManager.setRecentRev(recent.rev);
await bookManager.setRecentDiffRev(recentDiff.rev);
console.log('loaded');
} else {
this.warning(`Неверный ответ сервера: ${recent.state}`);
}
@@ -392,14 +397,59 @@ console.log('loaded');
return;
}
//несколько замудреная инициализация oldRecent
if (!this.oldRecent) {
this.oldRecent = _.cloneDeep(bookManager.recent);
}
if (bookManager.loaded && !this.oldRecentInited) {
this.oldRecent = _.cloneDeep(bookManager.recent);
this.oldRecentInited = true;
}
//вычисляем дифф
/*let diff = utils.getObjDiff(this.oldRecent, bm.recent);
let diff = null;
if (itemKey) {//ускоренное вычисления диффа
let itemDiff;
if (this.oldRecent[itemKey]) {
itemDiff = utils.getObjDiff({[itemKey]: (this.oldRecentInited ? this.oldRecent[itemKey] : {})}, {[itemKey]: bm.recent[itemKey]});
} else {
itemDiff = utils.getObjDiff({}, {[itemKey]: bm.recent[itemKey]});
}
if (this.recentDiff) {
diff = this.recentDiff;
if (itemDiff.change[itemKey])
diff.change[itemKey] = itemDiff.change[itemKey];
if (itemDiff.add[itemKey])
diff.add[itemKey] = itemDiff.add[itemKey];
} else {
diff = itemDiff;
}
} else {//медленное вычисление диффа
if (this.oldRecentInited) {
diff = utils.getObjDiff(this.oldRecent, bm.recent);
} else
return;
}
if (utils.isEmptyObjDiff(diff))
return;*/
return;
let forceSaveRecent = true;
//вычисление критерия сохранения целиком
let forceSaveRecent = JSON.stringify(diff).length > 2000;
if (!forceSaveRecent && itemKey) {
if (!this.sameKeyCount)
this.sameKeyCount = 0;
if (this.prevItemKey == itemKey)
this.sameKeyCount++;
forceSaveRecent = this.sameKeyCount > 5 && (Object.keys(diff.change).length > 1);
this.sameKeyCount = (!forceSaveRecent ? this.sameKeyCount : 0);
this.prevItemKey = itemKey;
}
this.recentDiff = diff;
this.savingRecent = true;
try {
if (forceSaveRecent) {//сохраняем recent целиком
@@ -415,11 +465,11 @@ console.log('loaded');
await this.loadRecent(true, false);
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
} else if (result.state == 'success') {
//this.oldRecent = _.cloneDeep(bm.recent);
//this.recentDiff = null;
this.oldRecent = _.cloneDeep(bm.recent);
this.recentDiff = null;
await bm.setRecentRev(bm.recentRev + 1);
await bm.setRecentDiffRev(bm.recentDiffRev + 1);
console.log('saved');
console.log('saved1');
}
} else {//сохраняем только дифф
let result = {state: ''};
@@ -436,6 +486,7 @@ console.log('saved');
} else if (result.state == 'success') {
await bm.setRecentDiffRev(bm.recentDiffRev + 1);
}
console.log('saved2');
}
} finally {
this.savingRecent = false;

View File

@@ -129,6 +129,10 @@ export function getObjDiff(oldObj, newObj) {
return result;
}
export function isObjDiff(diff) {
return (_.isObject(diff) && diff.__isDiff);
}
export function isEmptyObjDiff(diff) {
return (!_.isObject(diff) || !diff.__isDiff ||
(!Object.keys(diff.change).length &&