Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash ';链';actionscript 3中的一系列函数_Flash_Actionscript 3_Event Handling_Listeners - Fatal编程技术网

Flash ';链';actionscript 3中的一系列函数

Flash ';链';actionscript 3中的一系列函数,flash,actionscript-3,event-handling,listeners,Flash,Actionscript 3,Event Handling,Listeners,我正在调用一个函数,并为该函数返回一些数据时添加一个侦听器。当返回数据时,我需要调用另一个函数等等 是否有一种简单的方法将这些函数“链接”在一起,以便第一个函数启动-等待侦听器,然后启动第二个,并为此创建一个侦听器,依此类推,直到最后一个函数调用一个在开始时定义的单独函数。我认为它可以在与批量加载程序脚本相同的行上工作 我设想代码的工作方式如下: var dataLoader:DataLoader = new DataLoader(onAllComplete, onError); dataLo

我正在调用一个函数,并为该函数返回一些数据时添加一个侦听器。当返回数据时,我需要调用另一个函数等等

是否有一种简单的方法将这些函数“链接”在一起,以便第一个函数启动-等待侦听器,然后启动第二个,并为此创建一个侦听器,依此类推,直到最后一个函数调用一个在开始时定义的单独函数。我认为它可以在与批量加载程序脚本相同的行上工作

我设想代码的工作方式如下:

var dataLoader:DataLoader = new DataLoader(onAllComplete, onError);

dataLoader.add(getData1, {args1, args2}, listnerType.DATA_LOADED);
dataLoader.add(getData2, {args3, args4}, listnerType.DATA_LOADED);
dataLoader.add(getData3, {args5, args6}, listnerType.DATA_LOADED);

dataLoader.start();

private function onAllComplete(e:Array):void {
  //where e contains an array of all the event results
}
private function onError(e:Event):void {
  //will fire if there are any errors along the way
}
谢谢,
Josh

我可能误解了你的意图,但根据你所描述的,你可以在调用处理程序时将它们链接起来。。。比如:你想用更简洁的语法做这样的事情吗

private function onComplete1(event:Event):void
{
    dataLoader.removeEventListener("onComplete", onComplete1);
    dataLoader.addEventListener("onComplete", onComplete2);

    ... // process event

    dataLoader.load(); // I don't remember the exact calls...
}

private function onComplete2(event:Event)void
{
    dataLoader.removeEventListener("onComplete", onComplete1);
    dataLoader.addEventListener("onComplete", onComplete2);

    ... // process event

    dataLoader.load(); // I don't remember the exact calls...
}

我觉得这个界面不错。实现取决于函数返回数据的方式。AS3不支持线程,因此必须编写getData()函数以异步运行。如果您是从远程站点加载数据,或者这很简单,只需使用内置的加载函数,使用getBytesLoaded()告诉它们何时完成,并在加载所有人时调用OnComplete回调

如果你只是在做一个很长的计算,你必须把它分解。比如:

class Computation {
    function Step() {/* ... */}
    function IsFinished() {/* ... */}
    function GetResult() {/* ... */}
}

为需要执行的每种计算创建类似的子类,然后将实例传递到数据加载器中。让他们每帧执行一次Step(),并在完成后调用OnComplete回调。

我只需要做一些简单的事情,比如:(另外,这是sorta psuedo代码,您需要正确的错误事件和内容)


包含非常好地处理链式异步操作的类。

在那里,完成了。以下是AS3代码:

package com.vpg.rns.util {

    public class AsynchIterator {
        private var iteratorPosition:int;
        private var iterableObjects:Array;
        private var onApply:Function;
        private var onComplete:Function;
        private var done:Boolean;

        public function get position() { return iteratorPosition; }

        public function get isDone() { return done; }

        public function get size() { return iterableObjects.length; }

        /** Create an iterator that will call the given function repeatCall once for each object in iterableObjects, before finally calling completeCall once at the end.
         * The calls will be made asynchronously, with event handlers used to stitch it all together.
         *
         * @param iterableObjects ....... Every object in this array will be passed as the first argument to repeatCall, in order.
         * @param repeatCall ............ This function will be called once for each object in iterableObjects. Its signature is repeatCall(Object, Function).
         * @param completeCall .......... Called once after every item in the array has been processed.
         *
         *
         */
        public function AsynchIterator(iterableObjects:Array, repeatCall:Function, completeCall:Function) {
            this.iteratorPosition = 0; 
            this.iterableObjects = iterableObjects;
            this.onApply = repeatCall;
            this.onComplete = completeCall;
            this.done = false;
        }

        public function iterate():void {
            doNext();
        }

        private function doNext() {
            if (isDone) {
                // Do nothing - already called onComplete. 
            }
            else if (position == size) { 
                done = true;
                onComplete();
            }
            else {
                var obj:Object = iterableObjects[iteratorPosition++];
                onApply(obj, doNext);
            }
        }

    }

}
显然,您需要添加一个错误处理函数,跟踪哪个失败和哪个成功,为fast fail和do all添加选项,等等

  • 保罗

是的,我想这样做,但我不想!当加载一个或两个时,这很好,但我有需要加载不同数据组合的情况,所以它会变得很混乱。你们看过BulkLoader了吗?它似乎完成了你想要的代码。google.com/p/bulk loader/。
package com.vpg.rns.util {

    public class AsynchIterator {
        private var iteratorPosition:int;
        private var iterableObjects:Array;
        private var onApply:Function;
        private var onComplete:Function;
        private var done:Boolean;

        public function get position() { return iteratorPosition; }

        public function get isDone() { return done; }

        public function get size() { return iterableObjects.length; }

        /** Create an iterator that will call the given function repeatCall once for each object in iterableObjects, before finally calling completeCall once at the end.
         * The calls will be made asynchronously, with event handlers used to stitch it all together.
         *
         * @param iterableObjects ....... Every object in this array will be passed as the first argument to repeatCall, in order.
         * @param repeatCall ............ This function will be called once for each object in iterableObjects. Its signature is repeatCall(Object, Function).
         * @param completeCall .......... Called once after every item in the array has been processed.
         *
         *
         */
        public function AsynchIterator(iterableObjects:Array, repeatCall:Function, completeCall:Function) {
            this.iteratorPosition = 0; 
            this.iterableObjects = iterableObjects;
            this.onApply = repeatCall;
            this.onComplete = completeCall;
            this.done = false;
        }

        public function iterate():void {
            doNext();
        }

        private function doNext() {
            if (isDone) {
                // Do nothing - already called onComplete. 
            }
            else if (position == size) { 
                done = true;
                onComplete();
            }
            else {
                var obj:Object = iterableObjects[iteratorPosition++];
                onApply(obj, doNext);
            }
        }

    }

}