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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

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

Регистрация: Jan 2009
Сообщений: 25
По умолчанию Вернуть объект из своего класса

Существует класс:
Код AS3:
package visualization {
	import flash.events.Event;
	import flash.net.*;
 
		public class Main {
 
				public function Main(){ // Конструктор
 
					}
 
				public function GetResultPHP(){
						var host:String = "http://xxx";
 
						var variables:URLVariables = new URLVariables("name=Franklin123");
						var myRequest:URLRequest = new URLRequest();
 						myRequest.method = URLRequestMethod.POST;
						myRequest.url = host + "/ascript.php";
   						myRequest.data = variables;
 
   						var loader:URLLoader = new URLLoader();
   						loader.dataFormat = URLLoaderDataFormat.BINARY;
   						//out_txt.text = myData.firstName+' \n' + myData.lastName;
						loader.addEventListener(Event.COMPLETE, completeHandler); 
   						try
   							{	
								loader.load(myRequest); //Посылаем данные 
   							}	
   						catch (error:Error)
   							{
      							trace('Error: answer');
   							}
					}
 
				public function completeHandler(event:Event):void //Эта функци вызывается когда произошёл ответ от сервера. loader.load(myRequest);
				{
					var array:Object = JSON.parse(event.target.data); // преобразовываем JSON в OBJECT
						var lenght:int = 0;
						for each (var i:* in array)
						{
							lenght++
						}
 
						array.lenght = lenght;
						this.resultLoad(array);
 
					}
 
				private function resultLoad(dataSet:Object):Object{ // Метод для возврата результата
						//trace(JSON.stringify(dataSet));
						return dataSet;
					}
 
			}	
	}
Всё работает c сервером от которого прилетает JSON ответ.
Далее в первом кадре своего проекта делаю так:
Код AS3:
import visualization.Main;
var res:Main = new Main();
var objRes:Object = res.GetResultPHP();
trace(objRes);
Но почему то выводиться null (((

Если сделать trace в классе Main() всё всё работает - как из него вернуть данные? Что я забыл сделать?
Спасибо!

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

Регистрация: Feb 2012
Сообщений: 1,540
Потому что сначала надо уроки посмотреть по программированию или что.
Функция GetResultPHP() ничего не возвращает, потому что загрузка не выполняется сразу.

Цитата:
array.lenght = lenght;
Здесь ошибка, пишется length.

Вообще у вас какой-то странный код, не пойму что он делает.

Код AS3:
package visualization {
	import flash.events.Event;
	import flash.net.*;
 
		public class Main {
 				public var data:Object;
 
				public function Main(){ // Конструктор
 
					}
 
				public function GetResultPHP(){
						var host:String = "http://xxx";
 
						var variables:URLVariables = new URLVariables("name=Franklin123");
						var myRequest:URLRequest = new URLRequest();
 						myRequest.method = URLRequestMethod.POST;
						myRequest.url = host + "/ascript.php";
   						myRequest.data = variables;
 
   						var loader:URLLoader = new URLLoader();
   						loader.dataFormat = URLLoaderDataFormat.BINARY;
   						//out_txt.text = myData.firstName+' \n' + myData.lastName;
						loader.addEventListener(Event.COMPLETE, completeHandler); 
   						try
   							{	
								loader.load(myRequest); //Посылаем данные 
   							}	
   						catch (error:Error)
   							{
      							trace('Error: answer');
   							}
					}
 
				public function completeHandler(event:Event):void //Эта функци вызывается когда произошёл ответ от сервера. loader.load(myRequest);
				{
					var array:Object = JSON.parse(event.target.data); // преобразовываем JSON в OBJECT
						var length:int = 0;
						for each (var i:* in array)
						{
							length++
						}
 
						array.length = length;
						this.resultLoad(array);
 
					}
 
				private function resultLoad(dataSet:Object):Object{ // Метод для возврата результата
						data = dataSet;
						return dataSet;
					}
 
			}	
	}
Теперь вообще не понятно как вы получите эти данные когда они вам нужны.
Делайте события, короче.

Добавлено через 47 секунд
И как вообще вы добавляете главный класс?

Код AS3:
var res:Main = new Main();

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

Регистрация: Jan 2009
Сообщений: 25
Да ошибочка с length ))).

Данный скрипт лезет на сервер достаёт от туда массив в JSON. И должен вернуть его.
Как я это понимаю:
Код AS3:
 var res:Main = new Main();
Вызываю объект класса в первом кадре своего проекта (по кнопочке F9).

Код AS3:
var objRes:Object = res.GetResultPHP();
Там же вызываю метод который должен вернуть результат.

Я только не понимаю почему функция ничего не возвращает? Срабатывает completeHandler в котором вызывается resultLoad в который передаётся объект - он то и должен вернуть результат.

Старый 07.06.2013, 19:24
Final Hope вне форума Посмотреть профиль Найти все сообщения от Final Hope
  № 4  
Ответить с цитированием
Final Hope
Banned
[+5 04.06.13]
[+1 08.06.13]

Регистрация: May 2013
Сообщений: 52
Цитата:
Срабатывает completeHandler в котором вызывается resultLoad в который передаётся объект - он то и должен вернуть результат.
Все верно. resultLoad возвращает результат в... В никуда.))) GetResultPHP ничего не возвращает. Чтобы присвоить переменной результат выполнения возвращающей функции, нужно писать вот так:
Код AS3:
function getNumber():Number { return 1; };
var n:Number = getNumber();
А вот так делать нельзя:
Код AS3:
function getNumber():Number { return 1; };
function startGetNumber() { getNumber(); };
var n:Number = startGetNumber();
Потому что функция startGetNumber ничего не возвращает.

Старый 07.06.2013, 19:31
n_drey вне форума Посмотреть профиль Отправить личное сообщение для n_drey Найти все сообщения от n_drey
  № 5  
Ответить с цитированием
n_drey
 
Аватар для n_drey

Регистрация: Jan 2009
Сообщений: 25
Ничего не понимаю ((( Как же мне быть в таком случае? Как получить данные ?
Вы привели примитивные примеры ))) Тут всё ясно. Что надо сделать и где выполнить return данных в моём случае?

Добавлено через 1 час 7 минут
Покурив доки - понял, что проблема в асинхронности. Функция GetResultPHP всегда будет возвращать null. Буду курить дальше доки на тему асинхронности.

Добавлено через 63 часа 26 минут
Люди поможите, перелопатил все доки, ничего не понял в этой асинхронности (((

Повторю ещё раз на простом примере:
Есть собственный класс в котором выполняется запрос на сервер и там получается ответ структура вот такая (для упрощения).
Код AS3:
 
class main {
   function getResultPHP(){
         //тут происходит настройка параметров для отправки на сервер с помощью URLLoader ///
 
        далее обработчик события на загрузку 
        loader.addEventListener(Event.COMPLETE, completeHandler); 
   }
 
 
  public function completeHandler(event:Event):void //
  {
        var array:Object = JSON.parse(event.target.data); // преобразовываем JSON в OBJECT
                /// если тут сделать trace то всё выводиться, но мне надо вернуть объект из этой функции.
		return array;					
  }
}
Далее на главной сцене пишу в первом кадре
Код AS3:
import visualization.Main;
 
var res:Main = new Main();
var r:Object = res.GetResultPHP();
trace(r); //
Получаю соответственно null.

Как получить результат из моего класса из функции getResultPHP()? Я понимаю почему функция не возвращает результат, но как мне дождаться ответа с сервера, а потом вернуть результат? Не могу никак понять как это работает в AS3. Ткните если не сложно на доку, где подробно описано данное хозяйство. Срок идёт, а я застрял на примитивной фигне ((((

Заранее благодарен.

Добавлено через 67 часов 59 минут
После 29 раза прочтения оф-доки разобрался самостоятельно! Использовал dispatchEvent !


Последний раз редактировалось n_drey; 07.06.2013 в 19:43.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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