Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Return в функциях (http://www.flasher.ru/forum/showthread.php?t=154857)

Lyso 23.04.2011 17:42

Return в функциях
 
У меня есть 2 класса. Main и Test.
Вот код класса Main (сокращен):
Код AS3:

package{
        import flash.display.MovieClip;
        import flash.text.*;
 
        public class Main extends MovieClip{
 
                private var id = 123;
 
                private var myCabin:MyCabin=new MyCabin(id);
 
 
                public function Main():void{
                        gold_txt.text=String(myCabin.getInfo);
                }
 
 
        }
}

А вот код класса MyCabin:
Код AS3:

package{
        import flash.display.MovieClip;
        import flash.net.*;
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
 
        public class MyCabin extends MovieClip{
 
                public function MyCabin(id):void{
                        _info(id);
                }
 
                public function _info(viewer_id):void{
                        var loader:URLLoader = new URLLoader();
                        var request:URLRequest = new URLRequest("http://max-user.ru/app/getInfo.php");
            request.method=URLRequestMethod.POST;
 
            var vars:URLVariables=new URLVariables();
            vars['id'] = id;
 
            request.data = vars;
                        loader.addEventListener(Event.COMPLETE,getInfo);
            loader.load(request);
                }
 
                public function getInfo(e:Event):int{
                        var loader2:URLLoader=URLLoader(e.target);
                        var variables:URLVariables = new URLVariables(loader2.data);
                        var gold:int=variables.gold;
                        return gold;
                }
 
 
        }
}

Проблема - в классе Main в текстовую область идет не 1000. (Если выводить через trace в MyCabin, то пишется 1000). В текст пишется: "function Function() {}".

Как решить эту проблему, чтобы при добавлении этой переменной в текст, выводилось 1000.

fish_r 23.04.2011 17:54

Вообще бы компилятор должен ругаться уже на это:
Код AS3:

public function getInfo(e:Event):int{

Функции слушатели в AS не возвращают значений.
Это первая ошибка. Вторая - вы запрашиваете значение до того как загрузка будет завершена. Ведь вы его запрашиваете сразу, при инициализации. А загрузка, даже, не успела начаться.

Lyso 23.04.2011 17:55

А как сделать, чтобы функция слушателя возвратила значение или как можно это заменить?
Вторую ошибку понял, спасибо.

goodguy 23.04.2011 18:02

Цитата:

Вообще бы компилятор должен ругаться уже на это:
Код AS3:
public function getInfo(e:Event):int{
Функции слушатели в AS не возвращают значений.
С чего бы это? Не будет он ругаться на такую конструкцию.
Можно, скажем написать так:
Код AS3:

public function getInfo(e:Event = null):int {
    return 5;
}

И вызывать эту функцию не по событию. Другое дело, что смысла в этом нет.

Цитата:

А как сделать, чтобы функция слушателя возвратила значение или как можно это заменить?
Зачем?
Можно в теле функции обработчика события вызывать другую функцию, которая уже будет возвращать событие

iNils 23.04.2011 18:04

Цитата:

А как сделать, чтобы функция слушателя возвратила значение или как можно это заменить?
А куда она должна ее вернуть?

fish_r 23.04.2011 18:10

Поправил ваш код "на коленке". Пишу на смартбуке, здесь даже редактора нет. Попробуйте

Код AS3:

package{
        import flash.display.MovieClip;
        import flash.events.*;
        //ещё поправил
        import flash.text.*;
 
        public class Main extends MovieClip{
 
 
 
                private var id = 123;
 
                private var myCabin:MyCabin=new MyCabin(id);
 
 
                public function Main():void{
 
                myCabin.addEventListener(myCabin.END_LOAD, endLoadListener);       
 
                }
 
                private function endLoadListener(e:Event):void
              {
                      gold_txt.text=String(myCabin.GoldValue);
                }
 
        }
}

Код AS3:

package{
        import flash.display.MovieClip;
        import flash.net.*;
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
 
        public class MyCabin extends MovieClip{
 
                public static const END_LOAD:String = "END_LOAD";
                private var _gold:int;
 
                public function get GoldValue():int
              {
                      return _gold;           
              }
                public function MyCabin(id):void{
                        _info(id);
                }
 
                public function _info(viewer_id):void{
                        var loader:URLLoader = new URLLoader();
                        var request:URLRequest = new URLRequest("http://max-user.ru/app/getInfo.php");
            request.method=URLRequestMethod.POST;
 
            var vars:URLVariables=new URLVariables();
            vars['id'] = id;
 
            request.data = vars;
                        loader.addEventListener(Event.COMPLETE,getInfo);
            loader.load(request);
                }
 
                public function getInfo(e:Event):int{
                        var loader2:URLLoader=URLLoader(e.target);
                        var variables:URLVariables = new URLVariables(loader2.data);
                        _gold = variables.gold;
 
                        //эту строку тоже поправил, итак работало бы
                      //но так неправильно
                        dispatchEvent(new Event(END_LOAD));
                }
 
 
        }
}

Добавлено через 42 секунды
если всё норм. найдите десять отличий :)

Добавлено через 16 минут
Цитата:

Сообщение от goodguy (Сообщение 991613)
С чего бы это? Не будет он ругаться на такую конструкцию.

Надо же. Не знал. Даже не пробовал никогда вернуть значение из слушателя :)

goodguy 23.04.2011 19:01

Цитата:

Даже не пробовал никогда вернуть значение из слушателя
Не из слушателя, а из обработчика ;)

Wolsh 23.04.2011 22:27

Цитата:

gold_txt.text=String(myCabin.getInfo);
myCabin.getInfo – это функция, так что выводится все честно. Даже если бы она возвращала нужное значение. Даже если бы это было написано в обработчике. Так что первая ошибка - Main и не вызывал метод getInfo, в строку был преобразован сам метод.

fish_r 24.04.2011 07:27

Цитата:

Сообщение от goodguy (Сообщение 991620)
Не из слушателя, а из обработчика ;)

Ха! Сори, заклинило на "слушателях" :)

Lyso 24.04.2011 10:11

fish_r, ваш код мне не подходит. Поправил по-своему варианту, вот что вышло:
Main -
Код AS3:

package{
        import flash.display.MovieClip;
        import flash.net.*;
        import flash.display.*;
        import flash.text.*;
        import flash.events.*;
 
        public class Main extends MovieClip{
 
                private var id = 123;
 
 
 
                public function Main():void{
                        goToMyCabin();
                }
 
                private function goToMyCabin():void{
                        var myCabin:MyCabin=new MyCabin(id);
                        var gold=myCabin.getGold();
                        gold_txt.text=String(gold);
                }
 
        }
}

MyCabin -
Код AS3:

package{
        import flash.display.MovieClip;
        import flash.net.*;
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
 
        public class MyCabin extends MovieClip{
                private var gold=5;
 
                public function MyCabin(id):void{
                        _info(id);
                }
 
                public function _info(id):void{
                        var loader:URLLoader = new URLLoader();
                        var request:URLRequest = new URLRequest("http://max-user.ru/app/getInfo.php");
            request.method=URLRequestMethod.POST;
 
            var vars:URLVariables=new URLVariables();
            vars['viewer_id'] = viewer_id;
 
            request.data = vars;
                        loader.addEventListener(Event.COMPLETE,getInfo);
            loader.load(request);
                }
 
                public function getInfo(e:Event):void{
                        var loader2:URLLoader=URLLoader(e.target);
                        var variables:URLVariables = new URLVariables(loader2.data);
                        gold=variables.gold;
                }
 
                public function getGold(){
                        return gold;
                }
 
 
        }
}

Выводит 5 - стандартное значение переменной gold. А должно - 1000, полученное значение с сервера.
Как сделать чтобы в Main-
Код AS3:

private function goToMyCabin():void{
                        var myCabin:MyCabin=new MyCabin(viewer_id);
                        var gold=myCabin.getGold();
                        gold_txt.text=String(gold);
                }

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


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

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