Форум 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=157440)

Wolf 05.06.2011 23:45

член класса (задаю значения)
 
вот есть такой код
Код AS3:

package
{
        //import vk.api.serialization.json;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.net.URLVariables;
        import flash.net.URLRequestMethod;
        import flash.events.Event;
        import vk.api.serialization.json.*;
        public class Server
        {
                private static const url:String = 'http://pira.ru/api.php';
                private static const skey:String = '812c0598112c692ab9e7dc2af0674cc3';
                private var loader:URLLoader;
                private var request:URLRequest;
                public var resp:Object;
 
                public function Server()
                {
                        loader=new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                }
 
                public function getData(...params)
                {
                        request = new URLRequest(url);
                        request.method = URLRequestMethod.POST;
                        var vars:URLVariables = new URLVariables();
                        if (params[0])
                        {
                                vars['do'] = params[0];
                        }
 
                        if (params.length > 1 && params.length % 2 == 1)
                        {
                                for (var i=1; i<params.length; i++)
                                {
                                        if (i % 2 == 1)
                                        {
                                                vars[params[i]] = params[i + 1];
                                        }
                                }
                        }
                        vars['skey'] = skey;
                        request.data = vars;
                        loader.load(request);
                }
 
                public function onComplete(e:Event)
                {
                        var js=new JSON()
                        trace(loader.data);
                        this.resp=js.decode(loader.data);
                        trace(resp.DATA.characters[1]);
                }
 
        }
 
}

запрос успешно выполняется. но после этого хоть я и переменной класа this.resp надаю значения, она также пуста и в loader.data также пусто. не могу понять почему так.

dimarik 06.06.2011 00:00

Если loader.data пуста, а Вы ожидаете там какой-то ответ, то воспользуйтесь любым HTTP-снифером, чтобы проверить что к вам приходит. Я пользую Flidder2

P.S. Wolf? У нас есть еще подобные свободные ники?

Добавлено через 23 минуты
Я немного обескуражен. Вы сказали, что
Цитата:

loader.data также пусто
Затем Вы утверждаете, что
Цитата:

loader.data не пуста
Возможно, что именно из
Код AS3:

trace(resp.DATA.characters[1]);

Вы получаете null?

Wolf 06.06.2011 00:06

ответ присылает мне сервер в формате json. я его декодирую и полученый объект назаначаю переменной. в функции onComplete(событие) loader.data не пуста и this.resp надано значение. но за пределами этой функции это просто ссылки на NULL

dimarik 06.06.2011 00:33

Я испытал первую машину времени.

Wolf 06.06.2011 00:37

хах) просто сообщение модерировалось.

так почему так? я же члену класа надаю значение, а оно куда-то пропадает

dimarik 06.06.2011 00:46

Хех. Я сам пытался возвратиться в прошлое. Я модератор.
Я думаю, что ключевое слово "надаю" обладает более сильным кунг-фу, чем я предполагал ранее.

Переспрошу. Только здесь вы получаете null?
Код AS3:

trace(resp.DATA.characters[1]);


Wolf 06.06.2011 00:59

здесь я получаю нормальное значение.

Код AS3:

package {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
 
        public class Main extends Sprite {
                var flashVars:Object = stage.loaderInfo.parameters as Object;
 
                public function Main() {
                        trace("Start");
                        var s:Server=new Server();
                        s.getData('getAccount','id','62810564');
                        trace(s.resp.DATA.characters); //вот здесь нуль
                        //var Acc:Account=new Account();
 
                }
        }
 
}

Код AS3:

package
{
        //import vk.api.serialization.json;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.net.URLVariables;
        import flash.net.URLRequestMethod;
        import flash.events.Event;
        import vk.api.serialization.json.*;
        public class Server
        {
                private static const url:String = 'http://pira.ru/api.php';
                private static const skey:String = '812c0598112c692ab9e7dc2af0674cc3';
                private var loader:URLLoader;
                private var request:URLRequest;
                public var resp:Object;
 
                public function Server()
                {
                        loader=new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                }
 
                public function getData(...params)
                {
                        request = new URLRequest(url);
                        request.method = URLRequestMethod.POST;
                        var vars:URLVariables = new URLVariables();
                        if (params[0])
                        {
                                vars['do'] = params[0];
                        }
 
                        if (params.length > 1 && params.length % 2 == 1)
                        {
                                for (var i=1; i<params.length; i++)
                                {
                                        if (i % 2 == 1)
                                        {
                                                vars[params[i]] = params[i + 1];
                                        }
                                }
                        }
                        vars['skey'] = skey;
                        request.data = vars;
                        loader.load(request);
trace(loader.data); //здесь тоже
                }
 
                public function onComplete(e:Event)
                {
                        var js=new JSON()
                        trace(loader.data);
                        this.resp=js.decode(loader.data);
                        trace(resp.DATA.characters[1]);
                }
 
        }
 
}


dimarik 06.06.2011 01:06

Вот теперь я понял, что ничем не могу помочь.

Wolsh 06.06.2011 05:32

[offtop]В принципе, с помощью машины времени реально унести запрос на несколько секунд в прошлое, чтобы к тому моменту когда плеер соберется его сделать, он уже был обработан сервером и плеер получил ответ.[/offtop]
Wolf, флэш не останавливается после каждой строчки, ожидая что ему надают. Если послали запрос, надо таки дождаться ответа – вот когда он придет, будет вызван обработчик onComplete и только "из него" можно продолжить работать с полученными данными.

Wolf 06.06.2011 15:05

дело в том что обработчик onComplete вызывается. и теле этого обработчика я надаю члену класа значение. но когда обработчик законччит свою работу все даные пропадают.

как мне тогда решить эту проблему? мне надо отправить на сервер зарос. сервер обрабатывает даные и дает ответ в формате json а мне надо эти даные обработать, сохранить и передать класу Account который отвечает за информацию о аккаунте в игре.

Код AS3:

package {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
 
        public class Main extends Sprite {
                var flashVars:Object = stage.loaderInfo.parameters as Object;
 
                public function Main() {
                        trace("Start");
                        var s:Server=new Server();
                        s.getData('getAccount','id','62810564');
                        trace(s.resp.DATA.characters);//NULL хотя я вызвал фунцию getData и обработчик запроса, который вызывается именно в ней закончил свою работу.
                        //var Acc:Account=new Account();
 
                }
        }
 
package
{
        //import vk.api.serialization.json;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.net.URLVariables;
        import flash.net.URLRequestMethod;
        import flash.events.Event;
        import vk.api.serialization.json.*;
        public class Server
        {
                private static const url:String = 'http://pira.ru/api.php';
                private static const skey:String = '812c0598112c692ab9e7dc2af0674cc3';
                private var loader:URLLoader;
                private var request:URLRequest;
                public var resp:Object;
 
                public function Server()
                {
                        loader=new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                }
 
                public function getData(...params)
                {
                        request = new URLRequest(url);
                        request.method = URLRequestMethod.POST;
                        var vars:URLVariables = new URLVariables();
                        if (params[0])
                        {
                                vars['do'] = params[0];
                        }
 
                        if (params.length > 1 && params.length % 2 == 1)
                        {
                                for (var i=1; i<params.length; i++)
                                {
                                        if (i % 2 == 1)
                                        {
                                                vars[params[i]] = params[i + 1];
                                        }
                                }
                        }
                        vars['skey'] = skey;
                        request.data = vars;
                        loader.load(request);
                }
 
                public function onComplete(e:Event)
                {
                        var js=new JSON()
                        trace(loader.data);
                        this.resp=js.decode(loader.data);
                        trace(resp.DATA.characters[1]);
                }
 
        }
 
}
}

Код AS3:

package pir {
          import flash.net.LocalConnection;
  import flash.external.ExternalInterface;
  import flash.events.*;
  import flash.utils.setTimeout;
        public class Account {
                private var id:int;
                private var characters:String;
                private var gm:Boolean;
                private var ban:Boolean;
                public function Account() {
                        var serv:Server=new Server();
 
                        trace("sds");
                        serv.getData('getAccount','id',serv.flashVars['viewer_id']);
                        trace(serv.resp.DATA.characters[0]);//такое тоже не катит
                }
 
        }
 
}


Wolsh 06.06.2011 15:19

Никто никуда не пропадает. Вы спрашиваете эти данные тогда, когда их еще нет. Вы послали привет серверу и тут же, в следующей строчке кода, работаете с его "ответом", хотя он еще даже не получил Ваш запрос. Это понятно? Вы замечали, что интернет-страницы открываются не сразу же в тот момент как Вы нажали на ссылку?

Wolf 06.06.2011 15:37

можно тогда пример как это должно быть? я просто еще никогда не работал с клиент-серверными приложениями

Добавлено через 6 минут
Код AS3:

                        var s:Server=new Server();
                        s.getData('getAccount','id','62810564');
                        if(s.onComplete) {
                        trace(s.resp.DATA.characters);
                        }

так тоже s.resp ссылка на объект NULL

t4arty 06.06.2011 15:52

ради интереса дождитесь появления stage

Wolf 06.06.2011 15:54

можно код примера?

Wolsh 06.06.2011 16:22

Вам не нужен никакой код, Wolf. Вам нужно открыть книгу и читать главу про События в ActionScript 3.0.
Это настолько базовая вещь, что без нее практически ничего сделать на флэш невозможно. По крайней мере, интерактивного. И клиент-серверные приложения тут абсолютно не при чем. И пересказывать тут основы, описанные в книгах, нет никакого смысла – они уже описаны и разжеваны. Это форум, здесь рассматривается конкретика и здесь помогают найти ошибки. У Вас – не ошибка. У Вас непонимание основ. Лечится чтением хелпа и книжек. Читайте все про События и Событийную модель AS3.

Wolf 07.06.2011 16:33

неужели так сложно помочь?

etc 07.06.2011 17:04

Цитата:

Сообщение от Wolf (Сообщение 1001857)
неужели так сложно помочь?

Вы просите не помощь, а решить задачу вместо вас.

Wolf 07.06.2011 17:13

я прошу помочь как отреагировать на полную загрузку. тоесть что вызвать, после onComplete и как

Добавлено через 4 минуты
и еще вопрос: у меня, например, есть какаято переменная в мейне. в конструторе мейна я обращаюсь к другому класу и методам. можно из этих других методов управлять переменными мейна?

Wolsh 07.06.2011 18:13

Вот это и есть ответ - "вызвать после onComplete". Вам надо перестроить мышление, чтобы думать не последовательным свитком кода в 10000 строк в одном единственном методе, а – блоками, которые реагируют на события. Программа больше похожа на паутину с пересекающимися связями, она модульная, блочная, состоит из коротких методов, обработчиков событий и вспомогательных функций вычисления. Если Вы, к примеру, хотите отобразить в приложении картинку юзера, то Вы посылаете запрос к апи с его айдишником. На этом месте код заканчивается – пока не придет ответ сервера, Вы ничего не можете сделать. Продолжение находится в другом блоке. Вы можете продолжить, когда придет ответ и будет вызван обработчик. В обработчике сохраняете данные и вызываете следующий метод - лоадАватар например, которому отдаете УРЛ картинки, полученный из ответа сервера. ЛоадАватар создает Лоадер и делает новый запрос - на загрузку уже картинки, и на этом он сам заканчивается. Продолжение - в онКомплитАватарЛоадинг. И так все. Все из блоков. Просто блоки эти надо учиться делать многофункциональными и повторно используемыми, то есть универсальными - загрузчик картинок надо придумать так, чтобы им можно было грузить любую картинку в любой момент, а не только конкретный аватар.

По второму вопросу – во-первых на форуме правило: одна тема - один вопрос. Во-вторых: опять же, читайте про ООП. Управление всегда ниспадающее, иначе получите полный хаос. Здесь масса обсуждений была уже этой темы.

Wolf 07.06.2011 18:20

тоесть в конструкторе основного класа никак не получить загруженые даные?

Добавлено через 1 минуту
мне тяжело перестроиться на флеш, так как привык к СИ++ где код выполняется построчно

Wolsh 07.06.2011 18:29

В конструкторе - никак. И непонятно, зачем.

Wolf 07.06.2011 18:57

ладно это я уже понял. но почему вот этот код вызывает ошибку?

Код AS3:

public static var flashVars:Object = stage.loaderInfo.parameters as Object;

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

Wolsh 07.06.2011 19:02

потому что еще нет ни стейдж ни соответственно его свойств. Инициализируйте, когда будет стейдж (Event.ADDED_TO_STAGE).

Korchy 07.06.2011 19:07

Цитата:

Сообщение от Wolf (Сообщение 1001882)
мне тяжело перестроиться на флеш, так как привык к СИ++ где код выполняется построчно

Если вы знакомы с С++, то вам должно быть знакомо понятие асинхронного сокета. Считайте URLLoader асинхронным сокетом и сразу станет понятно, как получать через него данные с сервера.

Wolf 07.06.2011 19:12

спасибо всем огромное)))

P.S. как у вас тут на форуме репутацию повысить?


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

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