Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   URLLoader работает только в одном экземпляре класса (http://www.flasher.ru/forum/showthread.php?t=152652)

nka1024 21.03.2011 01:42

URLLoader работает только в одном экземпляре класса
 
Приветствую

я написал класс для взаимодействия с php-скриптом, который обрабатывает запросы к mysql. запросы отправляю через URLLoader, вот обрезанный пример класса:

Код AS3:

public class SQLWrapper extends MovieClip
{
        private var serverUrl:String = "http://192.168.177.128/";
        private var request:URLRequest;
        private var variables:URLVariables;
        private var loader:URLLoader;
        private var id:Number;       
        public  var object:Object;
        public        static const DATA_LOADED:String = "DATA_LOADED";
 
        public function SQLWrapper(_id:Number, _object:Object = null)        {
                object = _object;
                id = _id;
        }
 
        private function sndRequest():void {
                variables = new URLVariables();
                variables.id = id;
 
                request = new URLRequest();
                request.url = serverUrl;
                request.method = URLRequestMethod.GET;
                request.data = variables
 
                loader = new URLLoader();
                loader.addEventListener(Event.COMPLETE, rcv_hello);
                loader.load(request);       
        }
 
        private function rcvResponse(e:Event = null):void {
                loader.removeEventListener(Event.COMPLETE, dataLoaded);
 
                xml = XML(loader.data);
                sid = xml.children()[0].sid;
 
                trace(sid);
                dispatchEvent(new Event(SQLWrapper.DATA_LOADED));       
        }
}

все работает ок, но когда я создаю 2 экземпляра класса и вызываю в каждом функцию sndRequest(), запрос посылается только один, а событие лоадера COMPLETE срабатывает в каждом классе, и выводится два одинаковых sid.
вот пример создания экземпляров:

Код AS3:

public class Main
{
        public function Main():void
        {               
                var market:Market = new Market();
                stage.addChild(market);
 
                getMarketItems(market);
        }
 
        private function getMarketItems(market:Object):void {
                var sql_a:SQLWrapper = new SQLWrapper(1, market);
                sql_a.addEventListener(SQLWrapper.RESPONSE, marketResponse);
                sql_a.sendRequest();
        }
 
        private function marketResponse(e:Event = null):void {
                var market:Market = Market(e.target.object);
                var item:MarketItem = new MarketItem();
 
                market.addItem(item);
                getItemStats(item);
        }
 
        private function getItemStats(item:Object):void {
                var sql_b:SQLWrapper = new SQLWrapper(2, item);
                sql_b.addEventListener(SQLWrapper.RESPONSE, itemResponse);
                sql_b.sendRequest();
        }
 
        private function itemResponse(e:Event = null):void {
                var item:MarketItem = MarketItem(e.target.xml.sid);
                item.addStat(sid);
        }
}

во флеше шарю хреново и не совсем понимаю почему это происходит. подскажите что не так?

miki 21.03.2011 05:00

У тебя ошибка в методе sndRequest()
надо variables.id = _id;

nka1024 21.03.2011 11:59

Цитата:

Сообщение от miki (Сообщение 982335)
У тебя ошибка в методе sndRequest()
надо variables.id = _id;

почему?

carrotoff 21.03.2011 21:13

Внимательно код не изучал, но если верить словам, что срабатывает событие COMPLETE 2 раза, могу сказать следующее:

оба запроса посылаются на один url с одинаковыми параметрами?
URLRequest по умолчанию кэширует ответ сервера, потому как свойство URLRequest.cacheResponse по умолчанию true. Либо измените свойство на false, либо ко всем параметрам добавляйте еще один - случайное число. Например:
Код AS3:

private function sndRequest():void {
                variables = new URLVariables();
                variables.id = id;
 
                request = new URLRequest();
                request.url = serverUrl;
                request.method = URLRequestMethod.GET;
                variables.random = new Date().getTime(); // случайный параметр на время отладки
                request.data = variables;
 
                loader = new URLLoader();
                loader.addEventListener(Event.COMPLETE, rcv_hello);
                loader.load(request);       
        }

Подробнее здесь
http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/

nka1024 21.03.2011 21:53

спасибо, действительно кэш. URLRequest.cacheResponse только для air, так что взял решение с рандомной переменной. к слову, POST ответы не кэшируются, так что можно обойтись и без переменной.

cleptoman 22.03.2011 08:54

Цитата:

sql_a.sendRequest();
и
Цитата:

private function sndRequest():void
о_О как оно вообще работает? )

nka1024 22.03.2011 10:57

Цитата:

Сообщение от cleptoman (Сообщение 982684)
и

о_О как оно вообще работает? )

решил весь класс не копипастить, видать опечатался при обрезании


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

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