AS3多文件下载,完成后检查?

时间:2013-01-07 16:41:55

标签: actionscript-3 flash air

我循环遍历一小组文件名以从远程服务器获取并在本地保存。这个工作正常。

问题是,我需要在下载完成后运行我的下一个功能。

目前,我的函数,我们称之为step2(),在所有FileStreams完成之前调用(事实上,在该函数开始之前调用它!)

我读到使用openAsynch时有一个完整的事件监听器,但我需要检查所有文件,例如已写入3个远程swfs),然后启动step2()函数。

我该如何解决这个问题?

以下代码:

function onPlaylistComplete(e:Event)
{
    var myArray:Array = new Array();
    for each(var i in list_of_files)
    {
        myArray.push(i);
    }

    for(i = 0; i < myArray.length; i++)
    {
        swfItem = myArray[i];
        var urlString:String =  site_url + myArray[i];
        var urlReq:URLRequest = new URLRequest(urlString);
        var urlStream:URLStream = new URLStream();

        urlStream.addEventListener(Event.COMPLETE, urlStreamComplete(swfItem));
        urlStream.load(urlReq);
    }

    function urlStreamComplete(swfItem):Function
    {
        var downloadSwf:Function = function (event:Event):void {
            var fileData:ByteArray = new ByteArray();
            var stream = event.target;
            stream.readBytes(fileData, 0, stream.bytesAvailable);
            try {
                var f : File = File.documentsDirectory.resolvePath(swfItem);
                var fs : FileStream = new FileStream();
                fs.addEventListener(Event.COMPLETE, fileCompleteHandler);
                fs.openAsync(f, FileMode.WRITE);
                fs.writeBytes(fileData);
            }
            catch (err : Error) {
                trace(err.message);
            }
        }
        return downloadSwf;
    }

    function fileCompleteHandler(e:Event):void {
        e.target.close();
    }

    step2(); // this seems to run before UrlStreamComplete()
}

3 个答案:

答案 0 :(得分:0)

你不能移动step2();在fileCompleteHandler函数的末尾? 因为此时step2();经过之后调用(i = 0; i&lt; myArray.length; i ++)  循环(这是早期的方法)。

答案 1 :(得分:0)

问题for loop它永远不会与异步模型一起使用。所以最好需要使用递归函数。

downloadAllFiles方法第二个arg是所有下载完成时调用的函数。然后你可以调用step2()或其他任何东西。

确保在下载IOErrorEvent等文件时出现任何问题......

    downloadAllFiles(myArray,function():void
    {
        step2();
    });

    function downloadAllFiles(myArray:Array, complete:Function):void
    {
        if(myArray && myArray.length == 0)
        {
            if(complete)
                complete.call();
            return;
        }

        swfItem = myArray.shift();

        var urlString:String =  site_url + swfItem;
        var urlReq:URLRequest = new URLRequest(urlString);
        var urlStream:URLStream = new URLStream();

        urlStream.addEventListener(Event.COMPLETE, function (event:Event):void 
        {
            var fileData:ByteArray = new ByteArray();
            var stream = event.target;
            stream.readBytes(fileData, 0, stream.bytesAvailable);

            try {
                var f : File = File.documentsDirectory.resolvePath(swfItem);
                var fs : FileStream = new FileStream();

                fs.addEventListener(Event.CLOSE, function(closeEvent:Event):void
                {
                    downloadAllFiles(myArray,complete);
                    return;
                });
                fs.openAsync(f, FileMode.WRITE);
                fs.writeBytes(fileData);
            }
            catch (err : Error) 
            {
                trace(err.message);
            }
        });

        urlStream.load(urlReq);
    }

答案 2 :(得分:0)

您缺少的方法是检查列表中的所有文件是否已加载, 3vliguy 是否正确且您的step2();应该在完整的处理程序中但是,并非单独,您还必须测试是否加载了所有文件。你可以用各种方式做到这一点,例如:使用文件计数器,当它为0(加载所有文件)时,你将执行step2()否则你将忽略它并减少计数器。

P.S。 Raja Jaganathan 方式也可以正常工作,只有排队加载,而计数器则可以在开头加载所有文件。