Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вернуть объект из своего класса (http://www.flasher.ru/forum/showthread.php?t=200819)

n_drey 07.06.2013 18:57

Вернуть объект из своего класса
 
Существует класс:
Код 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() всё всё работает - как из него вернуть данные? Что я забыл сделать?
Спасибо!

MikroAcse 07.06.2013 19:03

Потому что сначала надо уроки посмотреть по программированию или что.
Функция 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();


n_drey 07.06.2013 19:07

Да ошибочка с length ))).

Данный скрипт лезет на сервер достаёт от туда массив в JSON. И должен вернуть его.
Как я это понимаю:
Код AS3:

 var res:Main = new Main();

Вызываю объект класса в первом кадре своего проекта (по кнопочке F9).

Код AS3:

var objRes:Object = res.GetResultPHP();

Там же вызываю метод который должен вернуть результат.

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

Final Hope 07.06.2013 19:24

Цитата:

Срабатывает 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 ничего не возвращает.

n_drey 07.06.2013 19:31

Ничего не понимаю ((( Как же мне быть в таком случае? Как получить данные ?
Вы привели примитивные примеры ))) Тут всё ясно. Что надо сделать и где выполнить 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 !


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

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