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

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

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

Регистрация: Dec 2007
Сообщений: 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;
}

Старый 23.04.2009, 00:26
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 2  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
И куда у тебя должен попасть массив?

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

Код 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;
}


Последний раз редактировалось Rzer; 23.04.2009 в 00:45.
Старый 23.04.2009, 00:37
BAtic вне форума Посмотреть профиль Отправить личное сообщение для BAtic Найти все сообщения от BAtic
  № 3  
Ответить с цитированием
BAtic

Регистрация: Dec 2007
Сообщений: 21
Идею понля, спасибо , но проверив, ошибка вылезает 1114: The public attribute can only be used inside a package.

Старый 23.04.2009, 00:41
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 4  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Это потому, что ты в кадре код пишешь, а не в отдельном файле, как положено. Просто слово public убери тогда.

Старый 23.04.2009, 00:48
BAtic вне форума Посмотреть профиль Отправить личное сообщение для BAtic Найти все сообщения от BAtic
  № 5  
Ответить с цитированием
BAtic

Регистрация: Dec 2007
Сообщений: 21
Пока что-то пусто(((
Код 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

Старый 23.04.2009, 00:53
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 6  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Подписав слушателя методом 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);
}

Старый 23.04.2009, 00:58
BAtic вне форума Посмотреть профиль Отправить личное сообщение для BAtic Найти все сообщения от BAtic
  № 7  
Ответить с цитированием
BAtic

Регистрация: Dec 2007
Сообщений: 21
Огромное спасибо! Теперь понял как работает addEventListener.

Старый 23.04.2009, 01:05
willis83 вне форума Посмотреть профиль Отправить личное сообщение для willis83 Найти все сообщения от willis83
  № 8  
Ответить с цитированием
willis83
 
Аватар для willis83

Регистрация: Jan 2008
Адрес: Украина, Славутич
Сообщений: 646
Отправить сообщение для willis83 с помощью ICQ
Можно сразу внутри функции передавать в массив который был определён внешне, зачем левый массив? сборщик муссора его скорее всего уберёт, но какой смысл лишний действий?

Старый 23.04.2009, 01:14
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 9  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Сборщик мусора его не уберет до тех пор, пока ссылка на него из переменной videoArray не будет убрана - это один массив, присвоение не плодит массивы. Конечно можно сразу писать во внешнюю переменную. Спросили как передать значение - так, мне кажется, нагляднее. А если эта внешняя переменная находится вне класса или же содержится как переменная какого либо подкласса, то еще и полезно.


Последний раз редактировалось Rzer; 23.04.2009 в 01:40.
Создать новую тему Ответ Часовой пояс GMT +4, время: 12:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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