0

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

TheURL = 是一个 ARRAY 中的一堆 url

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
    }

}

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

4

3 回答 3

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();
}
于 2012-09-02T18:24:18.737 回答
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
于 2012-09-02T18:28:36.730 回答
0

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

于 2012-09-02T18:39:03.527 回答