Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.08.2011, 01:34
Ookami вне форума Посмотреть профиль Отправить личное сообщение для Ookami Найти все сообщения от Ookami
  № 1  
Ответить с цитированием
Ookami
 
Аватар для Ookami

Регистрация: Aug 2011
Адрес: 56° 51' с.ш. 53° 13' в.д.
Сообщений: 172
Записей в блоге: 1
Question Получение результата запроса к php из класса

Доброго времени суток, форумчане. Почитал форум, но ответа на свой вопрос не нашел, посему вот:
Есть класс PHPTransfer
Код AS3:
package main.db {
	import flash.net.URLVariables;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.net.URLLoader;
	import flash.events.Event;
 
	public class PHPTransfer extends Object {
		public var site_path:String; // Должен заканчиваться на '/'
		public var script_path:String; // Относительно site_path
 
		public var php_response:String = "";
		public var OnComplete:Event;
 
		public function PHPTransfer() {
 
		}
 
		public function _POST(vars:URLVariables) {
			var req:URLRequest = new URLRequest(site_path + script_path);
			req.data = vars;
			req.method = URLRequestMethod.POST;
 
			var loader:URLLoader = new URLLoader();
			trace("Загрузка данных...");
			loader.load(req);
			loader.addEventListener(Event.COMPLETE, _complete);
			return loader.data;
 
			function _complete(ev:Event) {
				//php_response = ev.target.data;
				trace("Данные загружены!");
				ev.target.removeEventListener(Event.COMPLETE, _complete);
			}
		}
	}
 
}
Есть функция в main, использующая данный класс
Код AS3:
function btn_onclick(me:MouseEvent) {
	var php:PHPTransfer = new main.db.PHPTransfer;
	var vars:URLVariables = new URLVariables;
	vars.id		= 1;
	php.site_path	= "http://domain.com/";
	php.script_path	= "index.php";
	var res = php._POST(vars);
	trace(res);
}
Ну и, само собой, есть php-скрипт
PHP код:
<?php
$id 
$_POST["id"];
$connect mysql_connect("localhost""user""password");
mysql_select_db("ipkkodeks_astest"$connect)  or die ('Error: ' mysql_error());
$result mysql_query("SELECT name, username FROM users WHERE id=$id") or die("Invalid query: " mysql_error());
while (
$row mysql_fetch_array($result)) {
    
print_r($row);
}
Со стороны php ошибки нет, возвращает все корректно, т.е. проблема на стороне либо класса, либо функции. А проблема в следующем (вывод трейса):
Код:
Загрузка данных...
undefined
Данные загружены!
Т.е. ответ от рнр приходят позже, чем используются в функции. Как решить данную проблему?

Старый 31.08.2011, 02:03
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 2  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
АСИНХРОННОСТЬ и СОБЫТИЯ
и АНОНИМНЫЕ ФУНКЦИИ - ЗЛО (во всяком случае в ActionScript)
__________________
Отряд Котовскага

Старый 31.08.2011, 02:09
Ookami вне форума Посмотреть профиль Отправить личное сообщение для Ookami Найти все сообщения от Ookami
  № 3  
Ответить с цитированием
Ookami
 
Аватар для Ookami

Регистрация: Aug 2011
Адрес: 56° 51' с.ш. 53° 13' в.д.
Сообщений: 172
Записей в блоге: 1
Спасибо за оперативность. Понятно что асинхронность, вопрос как с ней бороться. Если все вышенаписанное делать не через класс а внутри функции - работает нормально, результат получаю из события COMPLETE. А как того же добиться внутри класса, чтоб _POST возвращал значение ПОСЛЕ того как оно прийдет от рнр?

Простите за возможно глупые вопросы, но я только начинаю разбираться с флешем и ас3, так что многие моменты не понятны в корне.

Старый 31.08.2011, 02:16
Ookami вне форума Посмотреть профиль Отправить личное сообщение для Ookami Найти все сообщения от Ookami
  № 4  
Ответить с цитированием
Ookami
 
Аватар для Ookami

Регистрация: Aug 2011
Адрес: 56° 51' с.ш. 53° 13' в.д.
Сообщений: 172
Записей в блоге: 1
Эм, что вы подразумеваете под анонимными функциями? Можно подробнее?

Точнее даже не что подразумеваете, а что именно хотели этим сказать? что их надо или НЕ надо использовать? и где?

Добавлено через 14 часов 12 минут
ребят, вы хоть подтолкните в нужном направлении


Последний раз редактировалось Ookami; 31.08.2011 в 12:23.
Старый 01.09.2011, 21:59
Newred вне форума Посмотреть профиль Отправить личное сообщение для Newred Посетить домашнюю страницу Newred Найти все сообщения от Newred
  № 5  
Ответить с цитированием
Newred
 
Аватар для Newred

Регистрация: May 2010
Адрес: Киев, Украина
Сообщений: 140
Записей в блоге: 2
Вот один из вариантов решения проблемы:

Код AS3:
private var res:*;
 
function btn_onclick(me:MouseEvent):void 
{
	var php:PHPTransfer = new main.db.PHPTransfer;
	php.addEventListener(PHPTransfer.COMPLITE, PHPComplite); // слушаем окончание загрузки 
	var vars:URLVariables = new URLVariables;
	vars.id		= 1;
	php.site_path	= "http://domain.com/";
	php.script_path	= "index.php";
	//var res = php._POST(vars);
           php._POST(vars);
}
 
private function PHPComplite(e:Event):void
{
	res =  php.getData(); 
	trace("new result "+res); 
}

Код AS3:
package main.db {
	import flash.net.URLVariables;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.net.URLLoader;
	import flash.events.Event;
 
	public class PHPTransfer extends Object {
 
		public static var COMPLITE:String = "complite";
 
		public var site_path:String; // Должен заканчиваться на '/'
		public var script_path:String; // Относительно site_path
 
		public var php_response:String = "";
		public var OnComplete:Event;
 
		private var loader:URLLoader = new URLLoader(); // loader переносим сюда, чтоб был доступен для всего класса
 
		public function PHPTransfer() {
 
		}
 
		public function _POST(vars:URLVariables) 
		{
			var req:URLRequest = new URLRequest(site_path + script_path);
			req.data = vars;
			req.method = URLRequestMethod.POST;
 
			//var loader:URLLoader = new URLLoader();
			trace("Загрузка данных...");
			loader.load(req);
			loader.addEventListener(Event.COMPLETE, _complete);
			//return loader.data;
 
			function _complete(ev:Event) {
				//php_response = ev.target.data;
				trace("Данные загружены!");
				dispatchEvent(new Event(COMPLITE)); // сообщаем что загрузка завершена
				ev.target.removeEventListener(Event.COMPLETE, _complete);
			}
		}
 
		public function getData():*
		{
			return loader.data;
		}
	}
 
}

Старый 01.09.2011, 23:18
Ookami вне форума Посмотреть профиль Отправить личное сообщение для Ookami Найти все сообщения от Ookami
  № 6  
Ответить с цитированием
Ookami
 
Аватар для Ookami

Регистрация: Aug 2011
Адрес: 56° 51' с.ш. 53° 13' в.д.
Сообщений: 172
Записей в блоге: 1
Спасибо большое. Примерно таким образом и решил проблему, с небольшими отличиями

Старый 12.11.2011, 03:43
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 7  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Цитата:
Сообщение от Ookami Посмотреть сообщение
Код AS3:
loader.load(req);
loader.addEventListener(Event.COMPLETE, _complete);
return loader.data;
 
function _complete(ev:Event) {
	//php_response = ev.target.data;
	trace("Данные загружены!");
	ev.target.removeEventListener(Event.COMPLETE, _complete);
}
1. Вы сначала загружаете, а после подписываетесь на Complete. Нужно наоборот
2. return loader.data - data здесь еще не готова, она будет готова только в _complete
__________________
adobe AS3 manual


Последний раз редактировалось strangedk; 12.11.2011 в 03:45.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.