循环内的 AS3 事件监听器

AS3 event listeners inside loop

我有点难以理解这个问题。

我正在创建一个 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");
            }               
        }
    }

一种方法是跟踪您正在上传的文件数量,并且仅在所有文件都完成后才在 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;
}