Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2014, 01:57
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

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

К примеру, пользователь печатает пост. Ну и отошел он от компа. Кука его скончалась. Он возвращается, допечатывает пост и отправляет.
В php я уже огранизовал повторную авторизацию с промежуточным хранилищем введенных пользователем данных. Если у пользователя кончилась кука пока он набирал пост, то его перекинет на форму авторизации, и если он верно введет логин/пароль, то его опять перекинет на форму, где он печатал свой пост. В форме естественно все будет на месте.

Так вот, решил сделать тоже самое но на стороне клиента. То есть, если кука кончилась, выскакивает окошко, где пользователь вводит логин/пароль, и если все ОК, то он просто остается там где и был.

Проблема в чем собственно... логика такая:

1. пользователь нажимает по кнопке "отправить"
2. скрипт перехватывает submit и отправляет запрос на сервер
3. сервер отвечает активен сеанс пользователя или нет.

Вот тут первая проблема: нужно ждать ответа сервера, чтобы решить - дать отправить форму или нет. То есть вернуть false и форма не отправится, или вернуть true и форма поедет на сервер.
Если использовать асинхронный запрос, то ничего не получается, так как скрипт не ждет ответа. Если использовать синхронный, то скрипт ждет, но и оборвать такой запрос не получается почему-то.
Пробовал в php прописать sleep(10), а в js сделать abort() через 3 секунды - не работает, браузер висит 10 секунд.
Едем дальше...

4. получили ответ от сервера - сеанс пользователя кончился.
5. делаем еще один запрос - просим у сервера форму авторизации в виде HTML строки.
6. получаем форму, накидываем тень и выводим форму - подписываемся на submit
7. перехватываем submit, отправляем данные на сервер и опять ждем...

Ну вообщем как-то так. С синхронными запросами все работает... если все работает на сервере. Но почему abort() не прерывает синхронный запрос?
Может есть другой вариант остановить js скрипт в ожидании ответа сервера, с возможностью прервать запрос и продолжить выполнение?
Ответить с цитированием
  #2 (permalink)  
Старый 17.03.2014, 02:07
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Hapson
Но почему abort() не прерывает синхронный запрос?
а почему должен? в синхронном выполнение скриптов блокируется
Сообщение от Hapson
Может есть другой вариант остановить js скрипт в ожидании ответа сервера, с возможностью прервать запрос и продолжить выполнение?
читать про колбеки, и асинхронную работу
Ответить с цитированием
  #3 (permalink)  
Старый 17.03.2014, 02:11
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Сообщение от dmitriymar
читать про колбеки, и асинхронную работу
А можно подробнее?
Вот кусок скрипта, здесь первый запрос на состояние сеанва пользователя
CheckLogin: function(){
	var result = false;
	var HTTP = getXmlHttp();
	var url = AjaxLogin.CheckURL;
	var param = "referer="+ encodeURIComponent(window.location.href);
	HTTP.open("POST", url, false);
	HTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	HTTP.onreadystatechange = function(){
		if(HTTP.readyState == 4 && HTTP.status == 200){
			var response = parseInt(HTTP.getResponseHeader("Status"));
			if(response === 0){
				if(AjaxLogin.GetForm()){
					EventHandler.add(document.forms[AjaxLogin.FormName], "submit", AjaxLogin.CheckForm);
					result = false;
				}else{
					result = true;
				}
			}else{
				result = true;
			}
			clearTimeout(waiting);
		}
	}
	HTTP.send(param);
	var waiting = setTimeout(function(){HTTP.abort();result = true;}, 2000);
	return result;
}
Ответить с цитированием
  #4 (permalink)  
Старый 17.03.2014, 02:22
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Если упростить первый пост, то вся суть вот в чем:
Функция перехватила submit и она должна вернуть false или true.
Но чтобы решить, что вернуть, нужно сделать запрос на сервер и дождаться ответа, то есть приостановить скрипт, но с возможностью возобновить работу при отсутствии ответа сервера
Ответить с цитированием
Ответ



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

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