Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.11.2011, 00:55
Интересующийся
Отправить личное сообщение для EvgeniyRRU Посмотреть профиль Найти все сообщения от EvgeniyRRU
 
Регистрация: 30.09.2011
Сообщений: 14

Достать результат выполнения ajax-запроса из функции
Добрый вечер, уважаемые участники форума. Возник вопрос, никак не могу понять с чем это дело есть.
Задача: в странице регистрации после проверки регуляркой корректности адреса электронной почты производится ajax-запрос, который отправляет на сервер введённый в поле ввода адрес е-мэйла, а сервер выдаёт результат (допустим 1, если такого адреса в базе данных нет и 2, если адрес в базе данных есть). Вот код:

function ajaxCheckEmail(email) {
//отправляем ajax-запрос на сервер для проверки существования адреса e-mail в базе данных
	var req = getXmlHttp();//создаём AJAX объект
		req.open('GET', 'http://sofakos.ru/registration.php?email=' + email, true);
		req.onreadystatechange = function() {
			if (req.readyState == 4) {
				if (req.status == 200) {
					window.acEmailResult = req.responseText;//записываем в глобальную переменную
				}
				
			}
		}
		req.send(null);
return window.acEmailResult;


FierBug показывает, что запрос отправляется, ответ от сервера корректный. Но вот беда, функция ajaxCheckEmail() выдаёт при певом вызове 'undefined', хотя должен быть 1 или 2. Также может перепутаться результат, хотя сервер отвечает корректно.
Проблема, как я понимаю, в глобальной переменной. А как тогда написать код потолковее, чтобы из обработчика асинхронного запроса возвращался корректный результат???
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2011, 02:30
Интересующийся
Отправить личное сообщение для koxt Посмотреть профиль Найти все сообщения от koxt
 
Регистрация: 26.09.2011
Сообщений: 13

по мотивам
https://github.com/davidflanagan/jav....06.getData.js

function getData(url, data, callback) {
    var request = new XMLHttpRequest(); 
    request.open("GET", url +                     // GET the specified url
                 "?" + encodeFormData(data));     // with encoded data added
    request.onreadystatechange = function() {     // Simple event handler
        if (request.readyState === 4 && callback) callback(request);
    };
    request.send(null);                           // Send the request
}

function getAnswer(request){
    alert(request.responseText);
}
   

function run(data){
    getData('http://example.com', data, getAnswer);
}
Ответить с цитированием
  #3 (permalink)  
Старый 04.11.2011, 07:35
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

ответ же асинхронно приходит. как может функция вернуть то, чего пока ещё нет? undefined. проблемы?)

есть два выхода : использовать функцию обратного вызова (см пример от koxt) или использовать неасинхронный вызов.

function ajaxCheckEmail(email) {

	var req = getXmlHttp();//создаём AJAX объект
		req.open('GET', 'http://sofakos.ru/registration.php?email=' + email, *!*false*/!*);

         req.send(null);

	if (req.status == 200) {
		window.acEmailResult = req.responseText;//записываем в глобальную переменную
	}
  
}

отличается она от другой тем, что при совершении запроса интерфейс заморозится. "зависнет", на секунду. это неприятно.
Ответить с цитированием
  #4 (permalink)  
Старый 04.11.2011, 12:46
Интересующийся
Отправить личное сообщение для EvgeniyRRU Посмотреть профиль Найти все сообщения от EvgeniyRRU
 
Регистрация: 30.09.2011
Сообщений: 14

koxt,
Никак не могу понять, читал несколько дней гугл с яндексом, а объяснения где и как нужно прописывать callback я не нашёл. Функция callback где-то идёт отдельно??? Что-то я вообще не понимаю
Ответить с цитированием
  #5 (permalink)  
Старый 04.11.2011, 13:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

да, она идёт отдельно. она будет исполняться в тот момент времени, когда данные придут с сервера (в обработчике события обычно в это время колбек вызывают).
Ответить с цитированием
  #6 (permalink)  
Старый 04.11.2011, 15:21
Интересующийся
Отправить личное сообщение для EvgeniyRRU Посмотреть профиль Найти все сообщения от EvgeniyRRU
 
Регистрация: 30.09.2011
Сообщений: 14

melky,
я задаю наверное глупые вопросы, но не могу никак понять, потому что пока в интернетах на материалы, где про это написано русским по белому не натыкался. А для чего тогда коллбэк-функция передаётся в параметры функции-обработчика, если её можно вызвать из функции-обработчика, не указывая параметры???
Ответить с цитированием
  #7 (permalink)  
Старый 04.11.2011, 19:32
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JQuery. Ajax. Глобальные функции Harvey jQuery 5 31.08.2011 16:54
return функции с ajax запросом !? namo86 AJAX и COMET 2 19.01.2011 19:30
результат от запроса jquery korner Общие вопросы Javascript 3 14.01.2011 16:05
Проблема с событиями после ajax запроса Mirgorod AJAX и COMET 5 12.06.2010 18:24
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23