
06.03.2020, 11:33
|
Аспирант
|
|
Регистрация: 26.03.2010
Сообщений: 55
|
|
Правильный синхронный AJAX под jQuery - как?
Привет всем. Прошу помощи по такой ситуации.
Есть некий веб-сервер (в общем случае нелокальный). Я пишу для него на javascript с применением jQuery клиентскую страницу для доступа к определенным функциям. Страница запрашивает с сервера информацию, дает пользователю ее отредактировать и отправляет обратно на сервер. Перед отправкой надо проверить данные на допустимость. Стандартная, в общем-то задача. Но неприятность заключается в том, что одно из введенных пользователем полей я на клиентской стороне проверить не могу - для этого надо посылать запрос на сервер. При этом пока сервер не ответил, форму для редактирования закрывать нельзя, ибо если он ответит, что данные нехорошие, надо пользователю дать возможность их исправить.
В принципе задача может быть решена путем явного указания на необходимость синхронного запроса:
jQuery.ajaxSetup( { async: false } );
jQuery.getJSON( ... );
jQuery.ajaxSetup( { async: true } );
Однако меня смущают предупреждения о том, что такая методика блокирует весь броузер на то время, пока на запрос не придет ответ. И в документации явно указывается, что это крайне нежелательная практика, и в разных описаниях-учебниках тоже.
Соответственно вопрос: как то же самое сделать совсем правильно? Чтобы и синхронность была, и никто не ругался, и никаких блокировок не было.
|
|

06.03.2020, 12:21
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от GRIG
|
При этом пока сервер не ответил, форму для редактирования закрывать нельзя
|
Вот и не разрешайте ее закрытие пока сервер не ответит, зачем синхронный запрос.
|
|

06.03.2020, 12:37
|
Аспирант
|
|
Регистрация: 26.03.2010
Сообщений: 55
|
|
Затем, что форму я тоже делаю не сам, а с помощью библиотеки. И в моем распоряжении только две функции, которые я могу написать сам, - одна обрабатывает валидацию формы, другая - ее закрытие и отсылку данных на сервер. При применении для валидации асинхронного запроса функция, которая обрабатывает ответ от сервера на валидацию поля, вызывается ПОСЛЕ того, как я выйду из функции валидации формы. (Увы, проверено) Т.е. валидация поля проходит, но перехватить результат этой валидации при этом я не могу, ибо он приходит слишком поздно.
Так что вопрос состоит в том, как внутри функции валидации формы организовать задержку до окончания валидации поля и получить результат этой валидации, и при этом сделать все "по уму" и ничего не заблокировать.
|
|

06.03.2020, 15:22
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от GRIG
|
я могу написать сам, - одна обрабатывает валидацию формы, другая - ее закрытие и отсылку данных на сервер
|
Значит не все потеряно. Можно же перед поверкой формы проверить нужное поле, а затем проверять остальное.
|
|

06.03.2020, 15:40
|
Аспирант
|
|
Регистрация: 26.03.2010
Сообщений: 55
|
|
Именно так и делаю. Но проблема в том, что та проверка, которую я могу сделать сам, занимает считанные микросекунды, а та проверка, ради которой я лезу на сервер, занимает от 50 миллисекунд и больше. И вот эти самые 50 мс надо как-то крутиться внутри функции, валидирующей всю форму, ждать результата серверной проверки и при этом не мешать работать другим (в том числе функции, которая принимает результат проверки с сервера).
|
|

06.03.2020, 16:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Мне трудно судить об всем не зная чем, как, и ... все это создается. Но чем бы и как не создавалась форма, инициируете создание все равно вы. А значит после ее создания можно запросить сервер проверить какое-то ее поле, и можете хоть час его проверять, а после ответа севера запускать проверку всей формы.
|
|

06.03.2020, 21:10
|
Аспирант
|
|
Регистрация: 26.03.2010
Сообщений: 55
|
|
Такой вариант не проходит сразу по двум причинам. Во-первых, поле, которое нужно проверить на сервере, вводится пользователем. Т.е. инициировать проверку этого поля можно только после того, как пользователь кликнул по кнопке "ОК" на форме. Во-вторых, я пользуюсь чужой библиотекой создания подобных форм, в код которой я вмешиваться не могу. Я только подсовываю этой библиотеке в качестве данных описание того, как выглядит форма, и несколько функций для выполнения специальных действий (в том числе одну для проверки допустимости введенных данных, другую для организации действий с введенными данными по передаче их на сервер). В частности, функция валидации формы должна вернуть библиотечному коду только true или false - можно или нельзя закрывать форму. Других вариантов ответа не предусмотрено конструкцией. И вызова нескольких функций валидации последовательно - тоже. Т.е. и проверка того специального поля, и проверка всего остального - все это должно быть сделано в рамках одной вызванной функции.
|
|

06.03.2020, 21:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
другая - ее закрытие и отсылку данных на сервер - это кто писал? Если вы можете управлять закрытием формы, то почему не можете проверить хоть все ее поля сервером и только по ответу его разрешить закрытие?
|
|

06.03.2020, 21:49
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,763
|
|
Сообщение от laimas
|
другая - ее закрытие и отсылку данных на сервер - это кто писал? Если вы можете управлять закрытием формы, то почему не можете проверить хоть все ее поля сервером и только по ответу его разрешить закрытие?
|
Вероятно потому, что эта функция не асинхронная. Если в ней запустить асинхронную операцию, то она не будет ждать, а вернется туда, откуда ее вызвали. И вернет не Промис, а значение.
|
|

06.03.2020, 21:55
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от voraa
|
Вероятно потому, что эта функция не асинхронная.
|
Да пофигу какая она, главное что если что-то может писать к форме, то она не за семью печатями. Есть нечто, что создает форму. Но она же не по прихоти нечто создается, а либо сразу при загрузке страницы, либо по вызову. Следовательно к ней можно достучаться. А если можно достучаться, то разве возбраняется, например, повесть событие на нужное поле, и как только оно будет заполнено, отправляем его на контроль серверу, и любые последующие изменения в нем также на контроль. И пока сервер не дал добро, блокируем кнопку отправления формы. И еще туеву тучу разных вариантов можно придумать.
|
|
|
|