我正在尝试按顺序加载一堆文件。我希望对方在上一次下载后开始下载。我认为最好的方法是通过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
}
}
重要的是,其他人在上一次完成之前不会开始下载。有关如何做到这一点的任何建议?感谢
答案 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。