Эталонный работающий вариант ServerStorage без оптимизации, с дебагом

This commit is contained in:
Book Pauk
2019-09-07 12:25:14 +07:00
parent 629d1b0630
commit a8abd5d427
3 changed files with 22 additions and 77 deletions

View File

@@ -54,7 +54,6 @@ class ServerStorage extends Vue {
this.oldProfiles = {};
this.oldSettings = {};
this.oldRecent = null;
}
async init() {
@@ -346,38 +345,17 @@ class ServerStorage extends Vue {
}
}
let recentDiff = null;
if (force || revs.items.recentDiff.rev != oldRecentDiffRev) {
try {
recentDiff = await this.storageGet({recentDiff: {}});
} catch(e) {
this.error(`Ошибка соединения с сервером: ${e.message}`);
return;
}
if (recentDiff.state == 'success') {
recentDiff = recentDiff.items.recentDiff;
if (recentDiff.rev == 0)
recentDiff.data = {};
await bookManager.setRecentDiffRev(recentDiff.rev);
} else {
this.warning(`Неверный ответ сервера: ${recentDiff.state}`);
recentDiff = null;
}
}
if (force || revs.items.recent.rev != oldRecentRev) {
if (force || revs.items.recentDiff.rev != oldRecentDiffRev || revs.items.recent.rev != oldRecentRev) {
let recent = null;
try {
recent = await this.storageGet({recent: {}});
recent = await this.storageGet({recent: {}, recentDiff: {}});
} catch(e) {
this.error(`Ошибка соединения с сервером: ${e.message}`);
return;
}
if (recent.state == 'success') {
let recentDiff = recent.items.recentDiff;
recent = recent.items.recent;
if (recent.rev == 0)
@@ -390,17 +368,13 @@ class ServerStorage extends Vue {
newRecent = recent.data;
}
this.oldRecent = _.cloneDeep(recent.data);//!!!
await bookManager.setRecent(newRecent);
await bookManager.setRecentRev(recent.rev);
await bookManager.setRecentDiffRev(recentDiff.rev);
console.log('loaded');
} else {
this.warning(`Неверный ответ сервера: ${recent.state}`);
}
} else if (revs.items.recent.rev == oldRecentRev && recentDiff && recentDiff.data) {
let i = 0;
while (!bookManager.loaded && i++ < 1000) utils.sleep(100);
const newRecent = utils.applyObjDiff(bookManager.recent, recentDiff.data);
await bookManager.setRecent(newRecent);
}
if (doNotifySuccess)
@@ -413,60 +387,26 @@ class ServerStorage extends Vue {
const bm = bookManager;
//несколько замудреная инициализация oldRecent
if (!this.oldRecent) {
this.oldRecent = _.cloneDeep(bookManager.recent);
}
if (bookManager.loaded && !this.oldRecentInited) {
this.oldRecent = _.cloneDeep(bookManager.recent);
this.oldRecentInited = true;
if (!bookManager.loaded) {
this.warning('Функции сохранения на сервер пока недоступны');
return;
}
//вычисляем дифф
let diff = null;
if (itemKey) {
//ускорение вычисления диффа
const itemDiff = utils.getObjDiff({[itemKey]: (this.oldRecentInited ? this.oldRecent[itemKey] : {})}, {[itemKey]: bm.recent[itemKey]});
if (this.recentDiff) {
diff = this.recentDiff;
diff.change[itemKey] = itemDiff.change[itemKey];
} else {
diff = itemDiff;
}
} else {
if (this.oldRecentInited) {
diff = utils.getObjDiff(this.oldRecent, bm.recent);
} else
return;
}
/*let diff = utils.getObjDiff(this.oldRecent, bm.recent);
if (utils.isEmptyObjDiff(diff))
return;
return;*/
//вычисление критерия сохранения целиком
let forceSaveRecent = JSON.stringify(diff).length > 1000;
if (!forceSaveRecent && itemKey) {
if (!this.sameKeyCount)
this.sameKeyCount = 0;
if (this.prevItemKey == itemKey)
this.sameKeyCount++;
let forceSaveRecent = true;
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 целиком
let result = {state: ''};
try {
result = await this.storageSet({recent: {rev: bm.recentRev + 1, data: bm.recent}});
result = await this.storageSet({recent: {rev: bm.recentRev + 1, data: bm.recent}, recentDiff: {rev: bm.recentDiffRev + 1, data: {}}});
} catch(e) {
this.error(`Ошибка соединения с сервером (${e.message}). Данные не сохранены и могут быть перезаписаны.`);
}
@@ -475,9 +415,11 @@ class ServerStorage extends Vue {
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');
}
} else {//сохраняем только дифф
let result = {state: ''};
@@ -489,7 +431,7 @@ class ServerStorage extends Vue {
}
if (result.state == 'reject') {
await this.loadRecent(false, false);
await this.loadRecent(true, false);
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
} else if (result.state == 'success') {
await bm.setRecentDiffRev(bm.recentDiffRev + 1);