문제

함수를 호출하고 함수가 일부 데이터를 반환 할 때 청취자를 추가하고 있습니다. 데이터가 반환되면 다른 기능 등을 호출해야합니다.

이 기능을 함께 '체인'하는 쉬운 방법이 있습니까? 첫 번째 기능이 불을 피우고 청취자를 기다린 다음 두 번째로 청취자를 만들어 내고 마지막 하나가 시작에 정의 된 별도의 함수를 호출 할 때까지. . 벌크 로더 스크립트와 같은 줄에서 작동한다고 생각합니다.

코드가 다음과 같은 작업을 계획하고 있습니다.

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
}

고마워요, 조쉬

도움이 되었습니까?

해결책

나는 단순한 일을 할 것입니다.

var numLoaded:int = 0;
var numError:int = 0;
var loadingIndex:int = 0;

var itemsToLoad:Array = ['img1.jpg', 'img2.jpg', 'img3.jpg'];

public function startLoading():void{
     loader.load(itemsToLoad[loadingIndex];
     loader.addEventListener(Event.COMPLETE, completeHandler);
}

public function completeHandler(event:Event):void{
     loadingIndex++;
     numLoaded++;
     if(numLoaded + numError >= itemsToLoad.length){
          onAllItemsComplete();
     }else{
          loader.load(itemsToLoad[loadingIndex];
     }
}

public function errorHandler(event:Event):void{
     loadingIndex++;
     numError++;
     if(numLoaded + numError >= itemsToLoad.length){
          onAllItemsComplete();
     }else{
        loader.load(itemsToLoad[loadingIndex]; 
     }
}

다른 팁

거기에 있었어. 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);
            }
        }

    }

}

분명히, 오류 핸들러 기능을 추가하고, 실패하고 성공했는지 추적하고, 빠른짜리 옵션과 all-you-can 등을위한 옵션을 추가하려고합니다.

나는 당신의 의도를 오해하고 있을지 모르지만, 당신이 묘사 한 바에 따르면, 당신은 핸들러를 불렀을 때 그것들을 체인 할 수 있습니다.

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() {/* ... */}
}

필요한 각 종류의 계산에 대해 서브 클래스를 한 다음 인스턴스를 데이터 로더로 전달하십시오. 프레임 당 한 번 단계 ()를두고 oncomplete 콜백이 모두 완료되면 호출하십시오.

splinklibrary 사슬이있는 비동기 작업을 다루는 클래스가 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top