Dollchan-Extension-Tools icon indicating copy to clipboard operation
Dollchan-Extension-Tools copied to clipboard

Слетела привязка поста к принадлежащим мне постам

Open XakepSDK opened this issue 6 years ago • 4 comments

Странным образом у меня подвисла вкладка и пропала привязка поста ко мне. Вот скрин: https://puu.sh/zOkX9/92f6b498e1.png

Я обновил страницу почти сразу после постинга и привязка пропала, причём вкладка подвисла на 0.3-0.5с. Поведение похоже на race condition, после постинга само сообщение не успело записаться в хранилище как моё из-за обновления страницы.

Firefox 59, linux.

XakepSDK avatar Mar 24 '18 04:03 XakepSDK

Вы обновили страницу раньше, чем появился пост в треде после отправки? Ну так сами себе злобный буратино же. Скрипт не занесет пост в хранилище моих постов, если ответ от сервера не успел прийти. В ответе от сервера в формате json должен содержаться номер вашего поста, и скрипт его заносит в хранилище locStorage['de-myposts'].

SthephanShinkufag avatar Mar 24 '18 18:03 SthephanShinkufag

Нет, иногда слетает и сильно позже. Мне кажется это связано с #1198

Y0ba avatar Mar 24 '18 18:03 Y0ba

Хм. Не сталкивался ниразу.

SthephanShinkufag avatar Mar 24 '18 18:03 SthephanShinkufag

Правда, я почти не пощу нигде :D

MyPosts.set есть только в одном месте - в checkUpload.

MyPosts.set(postNum, tNum || postNum);

где set

const MyPosts = new class MyPostsClass extends PostsStorage {
	....
	set(num, thrNum) {
		super.set(num, thrNum);
		this._cachedData.add(+num);
		sendStorageEvent('__de-mypost', 1);
	}

где super.set

class PostsStorage {
	....
	set(num, thrNum, data = true) {
		const storage = this._readStorage();
		if(storage && storage.$count > 5e3) {
			const minDate = Date.now() - 5 * 24 * 3600 * 1e3;
			for(const b in storage) {
				if(storage.hasOwnProperty(b)) {
					const data = storage[b];
					for(const key in data) {
						if(data.hasOwnProperty(key) && data[key][0] < minDate) {
							delete data[key];
						}
					}
				}
			}
		}
		(storage[aib.b] || (storage[aib.b] = {}))[num] = [this._cachedTime, thrNum, data];
		this._saveStorage();
	}

где

	_saveStorage() {
		if(this._cacheTO === null) {
			this._cacheTO = setTimeout(() => {
				if(this._cachedStorage) {
					locStorage[this.storageName] = JSON.stringify(this._cachedStorage);
				}
				this.purge();
			}, 0);
		}
	}

Где тут может быть подвох? Разве что после отправки поста между this._readStorage(); и this._saveStorage(); на одной вкладке зайти в другую вкладку и чудом успеть запостить другой пост.

SthephanShinkufag avatar Mar 24 '18 18:03 SthephanShinkufag