2016-06-20 26 views
1

私はこれを考え出すのに少し苦労しています。ループ内のAS3イベントリスナー

ローカルディレクトリからサーバーにファイルをアップロードするAir/Flashアプリケーションを作成しています(ユーザーの操作なし)。 フォルダにあるファイルの配列を作成していて、問題なくアップロードできます。 しかし、イベントリスナーを追跡することはできません。つまり、各アップロードのイベントリスナーの前でforループが完了することを意味します。

イベントリスナーを追跡し、最後のイベントリスナーがいつ終了したかを確認する方法はありますか?

すべてのヘルプは大歓迎です...ここで

は私のコードです:

public var UPLOAD_URL:String = "http://myhost/dev/uptest.php"; 
upbtn.addEventListener(MouseEvent.CLICK, uploadme); 
public function uploadme(event:MouseEvent):void 
    { 
     preloader.visible = true; 
     var desktop:File = File.applicationStorageDirectory.resolvePath("photo"); 
     var files:Array = desktop.getDirectoryListing(); 
     for (var i:uint = 0; i < files.length; i++) 
     { 
      var date:Date = new Date(); // get new date 
      var mytime:Number = Math.round(date.valueOf()/1000); 
      var ur:URLRequest = new URLRequest(); 
      var uv:URLVariables = new URLVariables(); 
      uv.filename = files[i].name; 
      ur.data = uv; 
      ur.method = URLRequestMethod.POST; 
      ur.url = UPLOAD_URL; 

      files[i].addEventListener(ProgressEvent.PROGRESS, updateProgress); 
      files[i].addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, doneUpload); 
      files[i].addEventListener(IOErrorEvent.IO_ERROR, fileError); 
      files[i].upload(ur); 
      //trace(i) 

      function updateProgress(event:ProgressEvent):void 
      { 
       //wait preloader.visible = true; 
       //trace(event.currentTarget.name); 
      } 
      function doneUpload(event:DataEvent):void 
      { 
       //var loader2: URLLoader = URLLoader(event.target); 
       //trace(i); 

       trace(event.data); 
       //preloader.visible = false; 
      } 

      function fileError(event:IOErrorEvent):void 
      { 
       trace("error"); 
      }    
     } 
    } 
+0

このようにしなければなりません。十分なローダーを作成し、それらを構造体にリンクし、 'doneUpload'リスナーでその構造体に行き、' event.target'を終了としてマークし、すべてが終了していれば構造体をチェックします。 – Vesper

+0

私はあなたがここで何をしようとしているのかについて100%明確ではありません。すべてのファイルがアップロードされるまで、UIを「待機」状態にしますか?アップロードが完了したら、各ファイルに固有の処理を行いますか?他に何か? – Brian

+0

私がやろうとしているのは、アップロードが完了している間にプリローダーを表示し、最後のファイルがアップロードされたときにプリロードを無効にすることです。 – cnapsys

答えて

2

一つのアプローチは、doneUploadリスナーに一度すべてをあなたがアップロードするファイル数のトラックだけの行為を維持することですファイルは終了しました:

private var numFiles:int = 0; 
public function uploadme(event:MouseEvent):void 
{ 
    ... 
    var files:Array = desktop.getDirectoryListing(); 
    numFiles = files.length; 
    for (var i:uint = 0; i < files.length; i++) 
    ... 


} 

function doneUpload(event:DataEvent):void 
{ 
    //var loader2: URLLoader = URLLoader(event.target); 
    //trace(i); 

    trace(event.data); 

    numFiles--; 

    if (numFiles == 0) { 
     trace("All the files are done uploading."); 
    } 

    //preloader.visible = false; 
} 
+0

OMG Brian、あなたは命を救っています...過去3時間私の頭を叩いていました... – cnapsys

+1

私はそれが助けて嬉しかった:)それはあなたがいくつかを保存する必要があるAS3のイベントスタイルのプログラミングでかなり一般的なパターンですリスナーがチェックする変数の余分なデータ。それは間違いなく慣れていくのです! – Brian

関連する問題