Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   addEventListener - вызывает функцию, как вернуть ее результат (http://www.flasher.ru/forum/showthread.php?t=124178)

BAtic 23.04.2009 00:21

addEventListener - вызывает функцию, как вернуть ее результат
 
Добрый день, только разбираюсь с AS3. Возможно вопрос мой туп, я наверное, даже посмеюсь над ним через пару недель, однако имею проблему. Я загружаю внещний ХМЛ, потом myLoader.addEventListener("complete", xmlLoaded); вызывает функцию хмлЛоадид, в ней я разбираю ХМЛ в массив, но вот как его вернуть в программу, для дальнейшей работы?
В функции я вроде предусмотрел возврат, но как присвоить результат ее выполнения новой переменной(массиву), а главное где это сделать, я не могу понять. Всем заранее спасибо.

Код AS3:

var myXML:XML = new XML(); 
 
var XML_URL:String = "MY_XML_FILE_PATH";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);
 
function xmlLoaded(event:Event):Array
{
    myXML = XML(myLoader.data);
        var videoArr:Array = new Array();
        for(var i:int=0;i<myXML.children().length();i++)
        {               
        videoArr[i] = [myXML.item[i].idVideo, myXML.item[i].nameVideo, myXML.item[i].urlVideo];
        }
        //trace(videoArr.length); //Здесь все выводится нормально
        return videoArr;
}


Rzer 23.04.2009 00:26

И куда у тебя должен попасть массив?

Хендлер события, это не функция, а метод - вернуть какое-то значение он конечно может, но в пустоту. Можно только вызвать другую функцию, паредав значение, или же записать твой массив во внешнюю переменную, например:

Код AS3:

var myXML:XML = new XML(); 
 
var XML_URL:String = "MY_XML_FILE_PATH";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
 
public var videoArray:Array;
 
myLoader.addEventListener("complete", xmlLoaded);
 
function xmlLoaded(event:Event):void
{
    myXML = XML(myLoader.data);
        var videoArr:Array = new Array();
        for(var i:int=0;i<myXML.children().length();i++)
        {               
        videoArr[i] = [myXML.item[i].idVideo, myXML.item[i].nameVideo, myXML.item[i].urlVideo];
        }
        videoArray=videoArr;
}


BAtic 23.04.2009 00:37

Идею понля, спасибо , но проверив, ошибка вылезает 1114: The public attribute can only be used inside a package.

Rzer 23.04.2009 00:41

Это потому, что ты в кадре код пишешь, а не в отдельном файле, как положено. Просто слово public убери тогда.

BAtic 23.04.2009 00:48

Пока что-то пусто(((
Код AS1/AS2:

var myXML:XML = new XML(); 
 
var XML_URL:String = "PATH";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
 
var videoArray:Array;
 
myLoader.addEventListener("complete", xmlLoaded);
 
function xmlLoaded(event:Event):void
{
    myXML = XML(myLoader.data);
    var videoArr:Array = new Array();
    for(var i:int=0;i<myXML.children().length();i++)
    {               
        videoArr[i] = [myXML.item[i].idVideo, myXML.item[i].nameVideo, myXML.item[i].urlVideo];
      }
      videoArray = videoArr;
}
 
trace(videoArray); //Выводит null

:(

Rzer 23.04.2009 00:53

Подписав слушателя методом addEventListener мы не вызываем метод xmlLoaded моментально - вызов произойдет через некоторое время после загрузки xml. А вот trace выполнится сразу.

Код AS3:

var myXML:XML = new XML(); 
 
var XML_URL:String = "PATH";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
 
var videoArray:Array;
 
myLoader.addEventListener("complete", xmlLoaded);
 
function xmlLoaded(event:Event):void
{
    myXML = XML(myLoader.data);
    var videoArr:Array = new Array();
    for(var i:int=0;i<myXML.children().length();i++)
    {               
        videoArr[i] = [myXML.item[i].idVideo, myXML.item[i].nameVideo, myXML.item[i].urlVideo];
      }
      videoArray = videoArr;
      doActionAfterLoading();
}
 
 
 
function doActionAfterLoading():void
{
  trace(videoArray);
}


BAtic 23.04.2009 00:58

Огромное спасибо! Теперь понял как работает addEventListener.

willis83 23.04.2009 01:05

Можно сразу внутри функции передавать в массив который был определён внешне, зачем левый массив? сборщик муссора его скорее всего уберёт, но какой смысл лишний действий?

Rzer 23.04.2009 01:14

Сборщик мусора его не уберет до тех пор, пока ссылка на него из переменной videoArray не будет убрана - это один массив, присвоение не плодит массивы. Конечно можно сразу писать во внешнюю переменную. Спросили как передать значение - так, мне кажется, нагляднее. А если эта внешняя переменная находится вне класса или же содержится как переменная какого либо подкласса, то еще и полезно.


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

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