2016-06-20 34 views
1

Ich habe ein bisschen eine harte Zeit, dieses herauszufinden.AS3 Event Listeners innerhalb der Schleife

Ich erstelle eine Air/Flash-App, die Dateien von einem lokalen Verzeichnis auf den Server hochlädt (ohne Benutzerinteraktion). Ich erstelle ein Array der Dateien im Ordner und kann sie ohne Probleme hochladen. Allerdings kann ich die Ereignis-Listener nicht verfolgen; Das bedeutet, dass die for-Schleife vor den Ereignis-Listenern für jeden Upload offensichtlich abgeschlossen wird.

Gibt es eine Möglichkeit, die Ereignislistener zu verfolgen und herauszufinden, wann die letzte beendet wurde?

Jede Hilfe wird sehr geschätzt ...

Hier ist mein Code:

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

Sie müssen so bauen. Sie erstellen genügend Loader und verknüpfen sie mit einer Struktur, dann gehen Sie im 'doneUpload'-Listener zu dieser Struktur und markieren Sie' event.target' als fertig und überprüfen Sie die Struktur, wenn alle fertig sind. – Vesper

+0

Ich bin nicht 100% klar, was Sie hier zu tun versuchen. Möchten Sie die Benutzeroberfläche so lange warten lassen, bis alle Dateien hochgeladen wurden? Nach dem Hochladen etwas für jede Datei tun? Etwas anderes? – Brian

+0

Alles was ich versuche ist einen Preloader während des Hochladens anzuzeigen und zu deaktivieren, wenn die letzte Datei hochgeladen wurde. – cnapsys

Antwort

2

Ein Ansatz ist, um zu verfolgen, wie viele Dateien Sie hochladen und nur handeln im Hörer doneUpload einmal alle Dateien sind fertig:

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, du bist ein Lebensretter ... hämmerst mir seit 3 ​​Stunden den Kopf ... – cnapsys

+1

Ich bin froh, dass es geholfen hat :) Es ist ein ziemlich häufiges Muster in AS3 Event-Style-Programmierung, wo Sie einige speichern müssen zusätzliche Daten in einer Variablen, die der Listener überprüft. Es ist definitiv etwas gewöhnungsbedürftig! – Brian