Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос по Event-ам (http://www.flasher.ru/forum/showthread.php?t=120824)

Vikar 31.01.2009 17:26

Вопрос по Event-ам
 
Вот,
как узнать в функции обработки события значение i?

Массивы DATA и loader должны соответствовать по своим индексам.
Код AS3:

var loader:Array = new Array();
var DATA:Array=new Array();
var i:int=0;
var req:URLRequest;
for (i=0;i<100;i++) {
req=new URLRequest("xxxxx"+i+"xx.xx");
loader[i]=new URLLoader();
loader[i].addEventListener(Event.COMPLETE, complete);
loader[i].load(req);
}
 
function complete(ev:Event):void {
//DATA[???]=event.target.data;
// Как тут узнать значение i элемента массива, с которым произошло это событие?
}


Kuruki 31.01.2009 18:04

Ну как вариант расширить URLLoader свойством, в котором сохранять значение id.
Код AS3:

package  
{
        import flash.net.URLLoader;
        import flash.net.URLRequest;
 
        public class MyLoader extends URLLoader
        {
                public var id:int;
 
                public function MyLoader(request:URLRequest = null)
                {
                        super(request);
                }
        }
}

Код AS3:

var loader:Array = new Array();
var i:int=0;
var req:URLRequest;
for (i=0;i<100;i++) {
req=new URLRequest("xxxxx"+i+"xx.xx");
loader[i]=new MyLoader();
loader[i].id = i;
loader[i].addEventListener(Event.COMPLETE, complete);
loader[i].load(req);
}
 
function complete(ev:Event):void {
trace((ev.target as MyLoader).id);
}


Волгоградец 31.01.2009 18:12

Код AS3:

function complete(ev:Event):void {
  for (var i:Number = 0; i < loader.length; i ++){
      if (URLLoader(e.target) == URLLoader(loader[i])) {
        DATA[i] = event.target.data;
      }
  }
}


etc 31.01.2009 20:33

Зачем вам вообще массив DATA?

Alex Lexcuk 31.01.2009 21:14

так наверно лучше
Код:

var loader:Array = new Array();
var DATA:Array=new Array();
var i:int=0;
var req:URLRequest;
i=0


req=new URLRequest("xxxxx"+i+"xx.xx");
loader[i]=new URLLoader();
loader[i].addEventListener(Event.COMPLETE, complete);
loader[i].load(req);
i++;
 
function complete(ev:Event):void {
if (i<100){
//DATA[???]=event.target.data;
// Как тут узнать значение i элемента массива, с которым произошло это событие?
req=new URLRequest("xxxxx"+i+"xx.xx");
loader[i]=new URLLoader();
loader[i].addEventListener(Event.COMPLETE, complete);
loader[i].load(req);

i++;
}
}

так будет загрузка происходить таким образом
Сначала один,
потом второй
...
ну и так далее по очереди.
А у вас сразу 100 почти одновременно (с разничей в микронаносекунды тактовой частоты процессора)
и не загрузятся вообще. А так может быть до первого не найденного файла.

BlooDHounD 31.01.2009 21:46

Волгоградец, это Вы всегда вместо indexOf используете?

Добавлено через 7 минут
тут даже ещё смешнее:
Код AS3:

function complete(ev:Event):void {
  // каждый раз запрашиваем length, что бы цикл подольше работал. и ещё тут очень необходима дробная часть i, вдруг итерация будет дробной?
  for (var i:Number = 0; i < loader.length; i ++){
      //тут, чтобы сравнить 2 объекта, мы зачем-то сперва их конвертируем, и потом пытаемся сравнить 2 объекта, а не пытаемся выяснить тот ли это объект. нам же недостаточно строгого сравнения. причём откуда-то берётся некий объект "e".
      if (URLLoader(e.target) == URLLoader(loader[i])) {
        // а тут уже появляется некий event. причём тут нам приведение типов нафиг не надо.
        DATA[i] = event.target.data;
      }
  }
}

Код AS3:

function complete(event:Event):void {
  var i:int = loader.indexOf( event.target );
  if ( i>=0 ) {
      DATA[i] = ( event.target as URLLoader ).data;
  }
}


Nirth 31.01.2009 22:19

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

etc 01.02.2009 02:53

Если есть массив loader, за каким хреном вам массив DATA? Получить данные можно и из массива loader всё по тем же индексам.

Vikar 03.02.2009 12:39

то просто короткий пример был
DATA у меня может быть массив TextField-ов или Мувиклипов, а Лоадером я загружаю данные для них (например чтобы вставить в соответствующие TextFieldы).
Загружать приходится много и все сразу.

Alex Lexcuk, можно одновременно грузить сколько угодно данных, они все корректно загрузятся. Но последовательная загрузка хороша тем что не будет тормозов :)

BlooDHounD 03.02.2009 13:22

Vikar, неа. одновременно бровзеры разрешают открывать до 2-4 соединение. если грузится будет много, то они тупо порвутся по таймаутам.

Vikar 03.02.2009 20:42

А, я думал про Флешплеер, он без препятствий грузит сразу множество данных.

BlooDHounD, а возможно ли применить indexOf, если у меня двухмерный массив loader[i][j] ?

BlooDHounD 04.02.2009 03:32

Vikar, а Вы как думаете? документацию трудно открыть?

G72RU 04.02.2009 14:36

Код AS3:

var loader : Array         = new Array();
var DATA : Array        = new Array();
var i : int                = 0 ;
var req : URLRequest ;
 
function tf ( l : URLLoader , i : int ) : void
{               
        l.addEventListener ( Event.COMPLETE , function ( e : Event ) : void
        {                       
                complete ( e , i ) ;
        } ) ;
}
 
for ( var i : int = 0 ; i < 100 ; i ++ )
{
        req                                = new URLRequest ( "URI" ) ;
        loader[i]                        = new URLLoader ( ) ;       
        tf ( loader[i] , i ) ;
        loader[i].load ( req ) ;
}
 
function complete ( e : Event , i : int ) : void
{       
        trace ( i ) ;       
}

Что-то типа того, работоспособность не проверял, хотя должно работать.

etc 04.02.2009 14:49

О боже мой, это антикод. Даже в таком виде он менее безумен:

Код:

var loader : Array        = new Array();
var DATA : Array        = new Array();
var i : int                = 0 ;
var req : URLRequest ;
var ldr:URLLoader = ;
for ( i = 0 ; i < 100 ; i ++ )
{
        req                                = new URLRequest ( "URI" ) ;
        ldr = loader[i]        = new URLLoader ( ) ;       
        ldr.addEventListener(Event.COMPLETE, complete);
        ldr.load(req);
}
 
function complete (event:Event) : void {       
        trace (loader.indexOf(event.target)) ;       
}


G72RU 04.02.2009 14:51

2 __etc, что-то не так?

etc 04.02.2009 14:53

Цитата:

Сообщение от G72RU (Сообщение 795532)
2 __etc, что-то не так?

Всё не так. Я дописал пост.

G72RU 04.02.2009 14:56

Единственное, плюс в моём варианте — ненандо ничего искать в массиве.

etc 04.02.2009 14:58

Да, только вот «не искать» мы размениваем на сотню анонимных функций, от которых отписаться невозможно в случае чего.
По хорошему, нужен обыкновенный хеш типа Dictionary.


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

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