Как Action Script 3 обрабатывает асинхронные обратные вызовы? - PullRequest
1 голос
/ 11 июля 2011

У меня есть фрагмент кода в моей игре, который выглядит примерно так:

MultiplayerAPI.createGameRoom(function(){ successFunction(new Object()); });        

По сути, выполняется createGameRoom и, в случае успеха, запускается переданная мною функция.

Однако недавно я столкнулся с некоторыми странными ошибками, и мне интересно, это экземпляр "new Object ();"то же самое каждый раз, когда запускается функция обратного вызова?

Каждый раз это должен быть новый, свежий экземпляр Object, но у меня возникают некоторые проблемы со сборкой мусора, из-за которых я думаю, что каждый раз передается один и тот же объектчто вызывается функция обратного вызова,

Кто-нибудь знает, как Flash это обрабатывает?

Ответы [ 2 ]

1 голос
/ 11 июля 2011

в вашем примере вы вызываете метод successFunction внутри определения, а не когда код должен быть выполнен. Вы должны передать ссылку на метод, а не вызывать его. Взгляните на следующие примеры. Если вы используете метод apply, вы можете передать аргументы как Array. * Николай

Справочник по функциям и вызов функции

function myFunction(parameter:String):String
{
    return 'hello '+parameter;
}

var myFunctionReference:Function = myFunction;
trace(myFunctionReference); // function Function() {}

trace(myFunctionReference('world')); // 'hello world'

var myFunctionReturnValue:String = myFunction('moon');
trace(myFunctionReturnValue); // 'hello moon'

Рабочий пример

package
{
    import flash.display.Sprite;

    public class MethodTest extends Sprite
    {   
        public function MethodTest()
        {
            trace('MethodTest Constructor');
            trace('---');
            invoke(successFunction,'first',{id:123,type:'foo'}); 
            trace('---');
            invokeByApply(successFunction,'second',{id:456,type:'bar'});   
        }

        public function invoke(method:Function,someName:String, someObject:Object):void{
            trace('MethodTest invoke');
            method(someName,someObject);
        }

        public function invokeByApply(method:Function,...arguments):void{
            trace('MethodTest invokeByApply');
            method.apply(null,arguments);
        }

        public function successFunction(someName:String, someObject:Object):void{           
            trace('MethodTest successFunction');
            trace('someName: '+someName);
            for(var key:String in someObject)trace(key+': '+someObject[key]);

        }
    }
}
0 голосов
/ 16 июля 2011

Написание кода AS3, как в приведенном вами примере (определение новых функций из вызовов других методов), как это делается в JavaScript, вам будет очень трудно отлаживать.

Я предлагаю проверить«ООП с ActionScript» Холла / Вана и использование преимуществ принципов объектно-ориентированного программирования, поскольку в долгосрочной перспективе это может облегчить вашу жизнь:

http://www.amazon.com/Object-Oriented-Programming-ActionScript-Branden-Hall/dp/0735711836

...