Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.03.2020, 11:33
Аспирант
Отправить личное сообщение для GRIG Посмотреть профиль Найти все сообщения от GRIG
 
Регистрация: 26.03.2010
Сообщений: 55

Правильный синхронный AJAX под jQuery - как?
Привет всем. Прошу помощи по такой ситуации.
Есть некий веб-сервер (в общем случае нелокальный). Я пишу для него на javascript с применением jQuery клиентскую страницу для доступа к определенным функциям. Страница запрашивает с сервера информацию, дает пользователю ее отредактировать и отправляет обратно на сервер. Перед отправкой надо проверить данные на допустимость. Стандартная, в общем-то задача. Но неприятность заключается в том, что одно из введенных пользователем полей я на клиентской стороне проверить не могу - для этого надо посылать запрос на сервер. При этом пока сервер не ответил, форму для редактирования закрывать нельзя, ибо если он ответит, что данные нехорошие, надо пользователю дать возможность их исправить.

В принципе задача может быть решена путем явного указания на необходимость синхронного запроса:
jQuery.ajaxSetup( { async: false } );
jQuery.getJSON(  ... );
jQuery.ajaxSetup( { async: true } );

Однако меня смущают предупреждения о том, что такая методика блокирует весь броузер на то время, пока на запрос не придет ответ. И в документации явно указывается, что это крайне нежелательная практика, и в разных описаниях-учебниках тоже.

Соответственно вопрос: как то же самое сделать совсем правильно? Чтобы и синхронность была, и никто не ругался, и никаких блокировок не было.
Ответить с цитированием
  #2 (permalink)  
Старый 06.03.2020, 12:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от GRIG
При этом пока сервер не ответил, форму для редактирования закрывать нельзя
Вот и не разрешайте ее закрытие пока сервер не ответит, зачем синхронный запрос.
Ответить с цитированием
  #3 (permalink)  
Старый 06.03.2020, 12:37
Аспирант
Отправить личное сообщение для GRIG Посмотреть профиль Найти все сообщения от GRIG
 
Регистрация: 26.03.2010
Сообщений: 55

Затем, что форму я тоже делаю не сам, а с помощью библиотеки. И в моем распоряжении только две функции, которые я могу написать сам, - одна обрабатывает валидацию формы, другая - ее закрытие и отсылку данных на сервер. При применении для валидации асинхронного запроса функция, которая обрабатывает ответ от сервера на валидацию поля, вызывается ПОСЛЕ того, как я выйду из функции валидации формы. (Увы, проверено) Т.е. валидация поля проходит, но перехватить результат этой валидации при этом я не могу, ибо он приходит слишком поздно.
Так что вопрос состоит в том, как внутри функции валидации формы организовать задержку до окончания валидации поля и получить результат этой валидации, и при этом сделать все "по уму" и ничего не заблокировать.
Ответить с цитированием
  #4 (permalink)  
Старый 06.03.2020, 15:22
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от GRIG
я могу написать сам, - одна обрабатывает валидацию формы, другая - ее закрытие и отсылку данных на сервер
Значит не все потеряно. Можно же перед поверкой формы проверить нужное поле, а затем проверять остальное.
Ответить с цитированием
  #5 (permalink)  
Старый 06.03.2020, 15:40
Аспирант
Отправить личное сообщение для GRIG Посмотреть профиль Найти все сообщения от GRIG
 
Регистрация: 26.03.2010
Сообщений: 55

Именно так и делаю. Но проблема в том, что та проверка, которую я могу сделать сам, занимает считанные микросекунды, а та проверка, ради которой я лезу на сервер, занимает от 50 миллисекунд и больше. И вот эти самые 50 мс надо как-то крутиться внутри функции, валидирующей всю форму, ждать результата серверной проверки и при этом не мешать работать другим (в том числе функции, которая принимает результат проверки с сервера).
Ответить с цитированием
  #6 (permalink)  
Старый 06.03.2020, 16:40
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Мне трудно судить об всем не зная чем, как, и ... все это создается. Но чем бы и как не создавалась форма, инициируете создание все равно вы. А значит после ее создания можно запросить сервер проверить какое-то ее поле, и можете хоть час его проверять, а после ответа севера запускать проверку всей формы.
Ответить с цитированием
  #7 (permalink)  
Старый 06.03.2020, 21:10
Аспирант
Отправить личное сообщение для GRIG Посмотреть профиль Найти все сообщения от GRIG
 
Регистрация: 26.03.2010
Сообщений: 55

Такой вариант не проходит сразу по двум причинам. Во-первых, поле, которое нужно проверить на сервере, вводится пользователем. Т.е. инициировать проверку этого поля можно только после того, как пользователь кликнул по кнопке "ОК" на форме. Во-вторых, я пользуюсь чужой библиотекой создания подобных форм, в код которой я вмешиваться не могу. Я только подсовываю этой библиотеке в качестве данных описание того, как выглядит форма, и несколько функций для выполнения специальных действий (в том числе одну для проверки допустимости введенных данных, другую для организации действий с введенными данными по передаче их на сервер). В частности, функция валидации формы должна вернуть библиотечному коду только true или false - можно или нельзя закрывать форму. Других вариантов ответа не предусмотрено конструкцией. И вызова нескольких функций валидации последовательно - тоже. Т.е. и проверка того специального поля, и проверка всего остального - все это должно быть сделано в рамках одной вызванной функции.
Ответить с цитированием
  #8 (permalink)  
Старый 06.03.2020, 21:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

другая - ее закрытие и отсылку данных на сервер - это кто писал? Если вы можете управлять закрытием формы, то почему не можете проверить хоть все ее поля сервером и только по ответу его разрешить закрытие?
Ответить с цитированием
  #9 (permalink)  
Старый 06.03.2020, 21:49
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,763

Сообщение от laimas Посмотреть сообщение
другая - ее закрытие и отсылку данных на сервер - это кто писал? Если вы можете управлять закрытием формы, то почему не можете проверить хоть все ее поля сервером и только по ответу его разрешить закрытие?
Вероятно потому, что эта функция не асинхронная. Если в ней запустить асинхронную операцию, то она не будет ждать, а вернется туда, откуда ее вызвали. И вернет не Промис, а значение.
Ответить с цитированием
  #10 (permalink)  
Старый 06.03.2020, 21:55
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от voraa
Вероятно потому, что эта функция не асинхронная.
Да пофигу какая она, главное что если что-то может писать к форме, то она не за семью печатями. Есть нечто, что создает форму. Но она же не по прихоти нечто создается, а либо сразу при загрузке страницы, либо по вызову. Следовательно к ней можно достучаться. А если можно достучаться, то разве возбраняется, например, повесть событие на нужное поле, и как только оно будет заполнено, отправляем его на контроль серверу, и любые последующие изменения в нем также на контроль. И пока сервер не дал добро, блокируем кнопку отправления формы. И еще туеву тучу разных вариантов можно придумать.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax. Как сделать загрузку изображений, отображение, удаление как на Авито wowtschuk AJAX и COMET 1 07.03.2017 01:34
jQuery Ajax - потеря функций Infinity178 jQuery 4 20.01.2017 07:15
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Посоветуйте как улучшить код для работы с history api [ jquery + js + history api ] Geo Ваши сайты и скрипты 0 12.01.2014 00:41
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48