0

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

问题是,下载完成后我需要运行下一个函数。

目前,我的函数,我们称之为 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()
}
4

3 回答 3

0

你不能移动 step2(); 在 fileCompleteHandler 函数的末尾?因为此时 step2(); 在通过 for(i = 0; i < myArray.length; i++) 循环后立即调用(这是早期的方式)。

于 2013-01-07T16:56:51.213 回答
0

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

downloadAllFiles 方法第二个参数,即所有下载完成后调用的函数。然后您可以调用 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);
    }
于 2013-01-08T05:33:32.043 回答
0

您缺少的是一种检查列表中的所有文件是否已加载的方法,3vliguy是正确的,您step2();应该在完整的处理程序中,但不仅如此,您还必须测试是否加载了所有文件。您可以通过多种方式执行此操作,例如使用文件计数器,当它为 0(所有文件已加载)时,您将执行step2(),否则您将忽略它并减少计数器。

ps Raja Jaganathan方式也可以,只是它是排队加载,而使用计数器,您可以从一开始就开始加载所有文件。

于 2013-01-08T08:19:56.167 回答