"Баг" сессии при использовании jquery.

Max

Новичок
"Баг" сессии при использовании jquery (проблема решена).

Доброго времени суток.
Возможно у кого нибудь была подобная ситуация, не могу пока понять в чем проблема.

Описание проблемы:
Представим есть 2 блока, выводящихся на страницу - Ф(фильтр) и Р(результат). Оба блока выводятся на страницу при помощи jquery.
При любом изменении в блоке Ф (допустим это список категорий с чекбоксами), через пару секунд после завершения всех действий срабатывает код который считывает состояние блока Ф, далее отсылает данные через jquery в другой php код который принимая данные из блока Ф обрабатывает их, тут же заносит результат в сессию, и тут же используя уже данные из сесии выводит соответственный результат в блок Р (допустим записи, соответствующие выбраным с помощю чекбоксов в блоке Ф категориям). После этого сразу же срабатывает код который переинициализирует блок Ф с учетом данных, находящихся уже в сесси (к примеру выводит тот же список чекбоксов с категориями, но кроме того отмечает ранее выбраные категории используя даные, которые мы занесли в сесию).
Все работает как и задумано, но в 1 случае из 20-30 происходит следующее: даные заносятся в сесию (все хорошо), результат в блоке Р выводится соответственный как и задумано (все хорошо), после чего происходит переинициализация фильтра где фильтр почему то видит даные в сессии которые соответствуют предидущим изменениям в блоке Ф.

Пример:
Действие 1.
- отмечаем 3 чекбокса из 20 в блоке Ф;
- получаем результат, соответствующий трем выбраным категориям в блоке Р;
- автоматическая переинициализация фильтра, выводится тот же список чекбоксов но три из них отмечены как и должно быть.

Действие 2.
- отмечаем еще 3 чекбокса из 20 в блоке Ф (получается отмечено уже 6 чекбоксов);
- получаем результат, соответствующий 6ти выбраным категориям в блоке Р (все правильно, значит сесия обновлена правильными значениями фильтра);
- автоматическая переинициализация фильтра, список чекбоксов но по прежнему отмечены только три из них, поскольку в даный момент из даного документа почему то видно даные сесии существовавшие при 1 действии.

P.S.: повторюсь, обычно это происходит на 5том-30том действии после чего опять все работает нормально, после чего баг может появится на любом и следующего множества действий (может появиться через 5 действий, может через 50). Другими словами, я не заметил никакой закономерности в возникновении ситуации (примерное множество действий произведенных мной для получения бага - более 200, ошибка возникла 5-10 раз).
P.P.S.: зарание спасибо за любую помощь
 

dimagolov

Новичок
смотри сколько запросов уходит на сервер при каждом действии.
[telepat mode on]
похоже, что запросов уходит одновременно несколько, причем первый, который долетает до сервера лочит сессию, а остальные курят в сторонке. потому первый отработал, вернул результат, пошел следующий. так как доходить до сервера могут они не в том порядке, в котором отправлены, то запросто последний отработавший может быть со "старыми" данными.
[telepat mode off]
 

Max

Новичок
еще не уверен, но кажется проблема решена.

Ситуация была такая: ява-скрипт который посылал запрос отрабатывал полностью, получал правильный результат, а за пределами запроса стоял инициализатор фильтра. Поэтому как вы правильно подметили, инициализатор фильтра в некоторых случаях мог срабатывать первым.
Решение проблемы: перенести инициализатор фильтра в часть где происходит получение даных после запроса пхп-кода, который заносит результаты фильтра в сесию.

...success: function(data){
сопутствующий код...
инициализатор...
}

вместо

...success: function(data){
сопутствующий код...

}
инициализатор...

dimagolov спасибо за ответ. Проблема себя исчерпала.
 

dimagolov

Новичок
хех...

кстати, из приколов нашего городка.

вот все уверенны, что JS не многопоточный и часто исходя из этого строится логика JS приложений, особенно в Web 2.0. А вот и фигушки, у FF JS многопоточный, мне удалось это выявить по крайней мере в одном варианте. когда это для меня создавало проблему я очень радовался при отладке, пока не понял причину данного действа.
 

Max

Новичок
первый раз узнал о многопоточности на простом FadeOut -> ...любые действия... -> FadeIn, к счастью вторым аргументом для этих функций можно указать действие по завершению работы функции. Сегодня не учел почему-то что вторая ф-ция просто срабатывает ранее первой, не там решение искал.
 

dimagolov

Новичок
первый раз узнал о многопоточности на простом FadeOut -> ...любые действия... -> FadeIn
не путайте многопоточность с неопределенностью порядка исполнения JS кода в некоторых случаях, например при нескольких обработчиках одного и того же события на одном элементе. под многопоточностью понимается исполнение разного JS кода одновременно, чего в обычных условиях не происходит. в FF это, похоже, появляется у разных документов, например у iframe. Без iframe это никак не влияет на работу, так как разные документы не имеют взаимозависимостей и когда какой код будет исполнен в общем без разницы. но когда документы это связанные в иерархию iframe, то возникают своеобразные эфекты, например несколько alert одновременно.
 

Max

Новичок
Мне кажется что не путаю. Я имел в виду следующий пример.
если мы напишем.
$("#block").fadeOut(600);
$("#block").empty().append(data);
$("#block").fadeIn(600);

то мы увидим как вначале работы первой строки функция отработает на 10-20% и сразу же пропадет текст, а потом насколько правильно я помню в момент исчезновения блока, он сразу же появится опять.
По вашим словам можно ли считать такую проблему проблемой вызванной многопоточностью js? Порядок получается правильный так как функции сработают одна за одной как и расположены в отрезке кода, но каждая из них не будет ждать момента завершения работы предидущей функции кроме случая когда мы принудительно заставим функцию сработать по завершению предидущей, как в примере ниже.

$("#block").fadeOut(600, function(){
$("#block").empty().append(data).fadeIn(600);
});
 

dimagolov

Новичок
я понятия не имею, что в исходниках fadeOut, но догадываюсь, что там что-то вроде setInterval или setTimeout. Так вот, код, который установлен на обработку этими ф-ями (то есть тот, который непосредственно отрисовывает выезжание) образуют отдельный блок в очереди исполнения. понятно, что после первого кода практически одновременно (сразу один за другим) начнется исполнение кода для выезжания и заезжания.

п.с. не зря я считаю, что JS фреймворки убивают мозг JS программистов. многие из тех, кто начал программировать на JS сразу с фреймворками и не догадываются, что же реально происходит в их программах и их стиль написания ближе к шаманизму, чем к осознанному применению инструмента.
 

weregod

unserializer
тех, кто начал "программировать" сразу с фреймворками я вообще бы поостерёгся называть "JS программистами"
 
Сверху