循环内的AS3事件监听器

时间:2016-06-20 16:40:21

标签: actionscript-3 flash air

我有点难以理解这一点。

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

1 个答案:

答案 0 :(得分: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;
}