2012-09-02 45 views
0

我想按順序加載一堆文件。我希望其他人在上次下載後開始下載。我認爲最好的方法是通過for循環。as3循環加載網址 - 繼續循環完成

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 
    } 

} 

直到前面已經完成了別人沒有開始下載重要的是一串網址。有關如何做到這一點的任何建議?謝謝

回答

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(); 
} 
+0

該死的,你快了:D但是,你不是指'shift()'而不是'unshift()'嗎? –

+0

是的,你是對的。謝謝。 – sch

+0

太棒了!我會在今天晚些時候進行測試。現在沒有時間了。非常感謝!! –

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 
+0

我需要幫助。還沒有得到它的工作,但我喜歡這個概念。你有時間嗎?例如你發佈。在URLStream.load(urlReq);但是在你的代碼中,urlReg不見了。我錯過了什麼嗎?此代碼也只能用逗號「concat」嗎?我的數組由「|」分隔 - -loadQueue(TheURL.concat()); –

+0

我沒有命名請求'urlReq'。在我的代碼中,它簡單地稱爲「請求」。一般來說,我沒有複製你的代碼並改變它 - 我重寫了它。 ;)數組:數組如何被'|'隔開除非它是一個帶有'|'的字符串作爲分隔符?如果'TheURL'是這樣一個字符串,那麼使用'TheUrl.split(「|」)'來創建一個字符串數組。當'TheURL'已經是一個數組的時候,'TheURL.concat()'就會以相同的順序創建一個新的數組,它具有相同的'TheURL'元素。 [Array.concat()的API文檔](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#concat()) –

0

你應該使用像使用GreenSock LoaderMax http://www.greensock.com/loadermax/庫。
這似乎比創建自己的加載隊列要困難得多。有很多錯誤,陷阱和特殊情況需要處理。它似乎工作正常,有一天,客戶打電話給你回來,因爲在這臺防火牆後面的計算機上的這個特殊的Flash版本的錯誤...我已經開始做我的圖書館,但最後我使用LoadManager。

+0

很酷,你能分享一個鏈接嗎?也可能是一些例子。我愛tweenMax等。 –

+0

它被稱爲LoaderMax,而不是LoaderManager(我更正了我的答案)。你可以在http://www.greensock.com/loadermax/找到它。只需下載它,並在使用之前花一些時間來學習它。這很值得。我已經能夠創建動態隊列,以便順暢地瀏覽20000圖像的圖庫。 – bokan