2009-06-23 8 views
2

私は関数を呼び出して、関数が何らかのデータを返すときにリスナーを追加しています。データが返されると、私は別の関数などを呼び出す必要があります。'連鎖'一連の関数を一緒にactionscript 3

これらの関数を一緒に「連鎖させて」最初のものが起動するようにする簡単な方法はありますか?リスナーが次に待機するのを待ってから、最後の呼び出しが別の関数を呼び出すまで最初に定義されています。これは、私はバルクローダースクリプトと同じ行で動作すると思います。

私はこのようなコード働いて何かを想定している:私はあなたの意図を誤解される可能性があります

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 
} 

おかげで、 ジョシュ

+0

あなたがBulkLoaderで見たことがありますか? code.google.com/p/bulk-loader/を探しているようです。 – quoo

答えて

2

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]; 
    } 
} 
0

を、しかしときハンドラあなたが説明したものから、あなたがそれらをチェーンすることができますlike:like:このようなことをやりたいのですが、もっと凝縮された構文を使っていますか?

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... 
} 
+0

はい私はこれをやりたいが凝縮した! 1つまたは2つの読み込み時にはうまく動作しますが、データのさまざまな組み合わせをロードする必要があるため状況が悪くなります。 – Josh

0

このインターフェイスは私にはよく見えます。実装は関数がデータをどのように返すかによって異なります。 AS3はスレッドをサポートしていないため、getData()関数を記述して非同期で実行する必要があります。リモートサイトなどからデータをロードする場合は、組み込みのローダー関数を使用し、getBytesLoaded()を使用して完了したことを通知し、全員がロードされたときにOnCompleteコールバックを呼び出します。

本当に長い計算をしているだけなら、それを分割する必要があります。ような何か:あなたがする必要がある計算の種類ごとにそのような

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

サブクラスの何かが、その後、あなたのデータローダーにインスタンスを渡します。フレームごとにステップ()を1回行い、すべて完了したらOnCompleteコールバックを呼び出します。私はちょうどのような単純な何かをするだろう

0

splinklibraryは非常にうまく連鎖asyncronous業務を処理するクラスが含まれています(また、これはみかんの擬似コードは、あなたが正しいエラーイベントとかが必要になりますです) 。

2

そこに、それをしました。ここで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); 
      } 
     } 

    } 

} 

明らかに、あなたは、エラーハンドラ関数を追加できなかったし、成功しているのを追跡し、高速フェール対のためのオプションを追加することになるでしょうか、すべてあなたが-できる、など

  • ポール
関連する問題