Работа над saveRecent
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
Reference in New Issue
Block a user