2016-06-20 48 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布賴恩,你是一個救生員......過去3小時一直在敲我的頭... – cnapsys

+1

我很高興它幫助:)這是一個在AS3事件風格的編程中很常見的模式,你需要保存一些監聽器將檢查的變量中的額外數據。這絕對需要一些習慣! – Brian