Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2013, 13:28   #1
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию Return из функции в функцию

В javascript новечек и не могу смекнуть как правильно вывести ответ от сервера в другую функцию. Код ниже:

Код:
function category_list_view(id) {
	var event="category_list_view";
	var category_list;
	var xmlhttp = getXmlHttp(); // Создаём объект XMLHTTP
    		xmlhttp.open('POST', '/admin/script/shop/shop_event.php', true); // Открываем асинхронное соединение
    		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем кодировку
    		xmlhttp.send("id="+encodeURIComponent(id)+"&event=" + encodeURIComponent(event)); // Отправляем POST-запрос
    		xmlhttp.onreadystatechange = function() { // Ждём ответа от сервера
      			if (xmlhttp.readyState == 4) { // Ответ пришёл
       		 		if(xmlhttp.status == 200) { // Сервер вернул код 200 (что хорошо)
       		   		alert(xmlhttp.responseText); // Выводим ответ сервера
       		 		}
      			}
  		};
	return xmlhttp.responseText;
 }


function category_add_form_show(id,name_kat) {
	alert(category_list_view(id));
}
Суть задачи - вызвать функцию category_list_view() из функции category_add_form_show() и вернуть значение обратно в функцию category_add_form_show().
Вот такой незамысловатый код, но зашел в тупик =) Базовых знаний не хватает.
Armatus вне форума Ответить с цитированием
Старый 13.11.2013, 13:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
зашел в тупик
Чет я не понял в чем именно тупик? Ты из category_list_view() возвращаешь значение
xmlhttp.responseText назад в category_add_form_show - задача решена.
А вот то что ты запрос асинхронным не сделал это уже сам виноват. Потому видимо он и возвращает в Алерт пустую строку.

Я скажу как бы я делал - callback
Код:
function category_list_view(id,callback) {
	var event="category_list_view";
	var category_list;
	var xmlhttp = getXmlHttp(); // Создаём объект XMLHTTP
    		xmlhttp.open('POST', '/admin/script/shop/shop_event.php', true); // Открываем асинхронное соединение
    		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем кодировку
    		xmlhttp.send("id="+encodeURIComponent(id)+"&event=" + encodeURIComponent(event)); // Отправляем POST-запрос
    		xmlhttp.onreadystatechange = function() { // Ждём ответа от сервера
      			if (xmlhttp.readyState == 4) { // Ответ пришёл
       		 		if(xmlhttp.status == 200) { // Сервер вернул код 200 (что хорошо)
       		   		callback(xmlhttp.responseText); // Выводим ответ сервера
       		 		}
      			}
  		};
	return xmlhttp.responseText;
 }

function category_add_Ok(s) {
	alert(s);
}

function category_add_form_show(id,name_kat) {
	category_list_view(category_add_Ok);
}
I'm learning to live...

Последний раз редактировалось Stilet; 13.11.2013 в 13:57.
Stilet вне форума Ответить с цитированием
Старый 13.11.2013, 14:15   #3
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А вот то что ты запрос асинхронным не сделал это уже сам виноват. Потому видимо он и возвращает в Алерт пустую строку.
Т.е. мой код не дожидается ответа от сервера и делает return xmlhttp.responseText;? Я и не хотел сделать выполнение функции асинхронным. В синхронном режиме можно это как то решить?
Armatus вне форума Ответить с цитированием
Старый 13.11.2013, 14:20   #4
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от Armatus Посмотреть сообщение
Т.е. мой код не дожидается ответа от сервера и делает return xmlhttp.responseText;? Я и не хотел сделать выполнение функции асинхронным. В синхронном режиме можно это как то решить?
Тогда ваш браузер повиснет до момента завершения запроса. Вы можете выполнять ajax запросы и синхронно, но тогда теряется смысл использовать ajax.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 13.11.2013, 14:22   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
А вот то что ты запрос асинхронным не сделал
а какой он? в том то и затык у автора что асинхронный.
eval вне форума Ответить с цитированием
Старый 13.11.2013, 14:25   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а какой он?
Что, опять рамсы попутал? Ну прошу прощения, я с терминологией иногда туплю.
Цитата:
можно это как то решить?
Мой способ подходит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.11.2013, 14:27   #7
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
а какой он? в том то и затык у автора что асинхронный.
Тогда выходит что ретурн не дожидается ответа от сервера и выдает пустую строку? Правильно мыслю?)

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что, опять рамсы попутал? Ну прошу прощения, я с терминологией иногда туплю.

Мой способ подходит?
Щас попробую ваш способ, но непонятен этот кусок кода:

Код:
function category_add_Ok(s) {
	alert(s);
}

function category_add_form_show(id,name_kat) {
	category_list_view(category_add_Ok);
}

Последний раз редактировалось Stilet; 13.11.2013 в 14:43.
Armatus вне форума Ответить с цитированием
Старый 13.11.2013, 14:33   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Ну прошу прощения, я с терминологией иногда туплю.
да ладно, я ж токмо ради истины
eval вне форума Ответить с цитированием
Старый 13.11.2013, 14:43   #9
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мой способ подходит?
Ваш способ работает, но не подходит. Мне на выходе надо получить что-то типа:

Код:
function category_list_view(id,callback) {
	var event="category_list_view";
	var category_list;
	var xmlhttp = getXmlHttp(); // Создаём объект XMLHTTP
    		xmlhttp.open('POST', '/admin/script/shop/shop_event.php', true); // Открываем асинхронное соединение
    		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем кодировку
    		xmlhttp.send("id="+encodeURIComponent(id)+"&event=" + encodeURIComponent(event)); // Отправляем POST-запрос
    		xmlhttp.onreadystatechange = function() { // Ждём ответа от сервера
      			if (xmlhttp.readyState == 4) { // Ответ пришёл
       		 		if(xmlhttp.status == 200) { // Сервер вернул код 200 (что хорошо)
       		   		callback(xmlhttp.responseText); // Выводим ответ сервера
       		 		}
      			}
  		};
	return xmlhttp.responseText;
 }


function category_add_form_show(id,name_kat) {
	var category_add_Ok;
	category_list_view(id,category_add_Ok);
Т.е. вернуть значение из функции category_list_view в функцию category_add_form_show. Почему у меня алерт выдает пустую строку - понятно. А как сделать ожидание ответа - непонятно =)
Armatus вне форума Ответить с цитированием
Старый 13.11.2013, 14:45   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я ж токмо ради истины
Ну мне тоже иногда пинок под зад не помешает.
Цитата:
как сделать ожидание ответа - непонятно
Оно уже сделано:
Цитата:
xmlhttp.onreadystatechange = function() { // Ждём ответа от сервера
if (xmlhttp.readyState == 4) { // Ответ пришёл
if(xmlhttp.status == 200) { // Сервер вернул код 200 (что хорошо)
callback(xmlhttp.responseText); // Выводим ответ сервера
}
}
};
Только маленькая (возможно малозначимая) ремарка: xmlhttp.send нужно вызывать после всех определений калбэков и событий для твоего аякса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP - case внутри функции нужен ли break когда делаем return? fishlabsoman PHP 3 29.10.2012 12:15
Передача значения из функции в функцию(с++) asdasys Помощь студентам 1 11.10.2012 22:04
Функции.Описать Функцию... Tiny Помощь студентам 4 30.03.2010 19:20
return 1 в void функции ! интеграл Помощь студентам 6 17.03.2010 22:00
Написать функцию в функции^^ kyroshyp Microsoft Office Excel 0 15.12.2009 19:58