as3循环加载网址 - 完成后继续循环

时间:2012-09-02 18:07:03

标签: actionscript-3 flash for-loop

我正在尝试按顺序加载一堆文件。我希望对方在上一次下载后开始下载。我认为最好的方法是通过for循环。

TheURL = ARRAY中的一堆网址

for(var i:int=0;i<TheURL.length;i++)
{
    var urlString:String = TheURL[i];
    var urlReq:URLRequest = new URLRequest(urlString);
    var urlStream:URLStream = new URLStream();
    var fileData:ByteArray = new ByteArray();
    urlStream.addEventListener(Event.COMPLETE, loaded);
    urlStream.load(urlReq);

function loaded(event:Event):void
    {
        /// code to continue loop
    }

}

重要的是,其他人在上一次完成之前不会开始下载。有关如何做到这一点的任何建议?感谢

3 个答案:

答案 0 :(得分:4)

function downloadFiles():void
{
    downloadNextFile();
}

function downloadNextFile():void
{
    var urlString:String = TheURL.shift();
    var urlReq:URLRequest = new URLRequest(urlString);
    var urlStream:URLStream = new URLStream();
    var fileData:ByteArray = new ByteArray();
    urlStream.addEventListener(Event.COMPLETE, loaded);
    urlStream.load(urlReq);
}

function loaded(event:Event):void
{
     downloadNextFile();
}

答案 1 :(得分:2)

使用for循环无法解决您想要做的事情。

在我看来,最简单的方法应该是将URL数组用作队列。这可以通过使用Array.shift()来完成。但是,如果在完成后需要原始URL集,则应该复制数组,因为shift()对数组进行内联修改。

解决方案可能如下:

function loadQueue(urlQueue:Array):void
{
    var url:String = urlQueue.shift();
    var request:URLRequest = new URLRequest(url);
    var stream:URLStream = new URLStream();
    var data:ByteArray = new ByteArray();

    var completeHandler:Function = function(event:Event)
    {
        // remove listener from stream to be a clean coder ;)
        stream.removeEventListener(Event.COMPLETE, completeHandler);

        // handle completion in the way you need ...

        // continue with the next element
        if (urlQueue.length > 0)
           loadQueue(urls);
    }

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

加载队列将如下所示:

loadQueue(TheURL.concat()); // concat() will clone your array

答案 2 :(得分:0)

您应该使用像greensock LoaderMax http://www.greensock.com/loadermax/这样的库 这比创建自己的加载队列要困难得多。有很多错误,陷阱和特殊情况需要处理。它看起来工作得很好,有一天客户给你回电话,因为这台防火墙后面的这台电脑上的这个特定的flash版本有一个bug ...我已经开始做我的库,但最后我使用了LoadManager。