2013-02-18 58 views
0

作爲一名PHP程序員,我非常習慣於這樣一個事實,即如果我調用函數function1()必須返回一些值,我會知道該程序將不會繼續,該函數返回。從同步流動到異步流動困境

現在,即時通訊使用AIR開發AS3的應用程序,我需要下載一些圖片,如果某些條件得到滿足,不知道有多少,所以使用對於這樣的IM:

for (var w:int=0; w < newData_array[2]['content'].length; w++) { 
    for (var j:int=0; j < oldData_array[2]['content'].length; j++) { 
     if((oldData_array[2]['content'][j]['id'] == newData_array[2]['content'][w]['id']) && (oldData_array[2]['content'][j]['last_mod'] != newData_array[2]['content'][w]['last_mod'])){ 
      //need to download a image... 
     } 
    }  
} 

正如你可以看到即時比較每個陣列中的每個元素(newData_arrayoldData_array)。如果條件符合,我需要下載一些東西,因爲我使用的是URLloader並且你知道這個函數是異步的,增加一個監聽器,當下載完成時會觸發一個事件,問題非常清楚,因爲urlloader不會停止for循環(就像我期望的PHP語言一樣),我只是在下載一組圖像的同時創建一個災難,因爲我不知道何時保存。所以我需要使用任何意思的聽衆,但因爲我不習慣這種程序,我非常鬱悶。

我對保存到磁盤例程不感興趣,該部分已經完成了,我只是想了解如何構造這個算法來完成這個工作。

回答

0

這讓我很煩惱,但人們必須認識到,你不能對內存中不存在的東西做些什麼,而這些加載操作可能需要一段時間。作爲單線程堆棧,Flash Player的加載操作會要求整個接口在加載期間凍結(如果限制爲循環)。

很明顯,有數據可用於循環,指示您對圖像執行什麼操作。我一直使用的解決方案是創建一個自定義加載函數來啓動加載,並返回一個代理圖像。你的循環獲得一個容器,你可以自由地將你的圖像放在你想要的位置。

與此同時,您的加載程序監聽程序已經跟蹤活動圖像加載及其相關代理。在加載時,交換的形象。

你的循環會是這個樣子......

for (var w:int in newData_array[2]['content']) { 
    for (var j:int in oldData_array[2]['content']) { 
     if ((oldData_array[2]['content'][j]['id'] == newData_array[2]['content'][w]['id']) && (oldData_array[2]['content'][j]['last_mod'] != newData_array[2]['content'][w]['last_mod'])){ 
      var proxy:MovieClip = loadImage("image/path.jpg"); 
      // Do stuff to proxy. 
     } 
    }  
} 

而且你的函數+聽衆會是這個樣子......

var proxies:Object = {}; 
function loadImage(path:String):MovieClip { 
    // load Image 
    var proxy:MovieClip = new MovieClip(); 
    proxies.path = proxy; 

    // Load Image 
} 

function imageLoaded(e:Event):void { 
    // Once loaded, use the filename as the proxy object's key to find the MovieClip to attach the image. 
    proxies[e.data.loaderInfo.filename].addChild(e.data); 
} 

這就在我頭頂,所以你需要找到實際的變量名稱,但我希望這是有道理的。

0

我不太確定如果我理解你的問題,但在我看來,你只需在你的內循環中添加相應的監聽器。

//take care this is pseudocode 

var parent = ... // some stage object 
for (var w:int=0; w < size1; w++) { 
    for (var j:int=0; j < size2; j++) { 
     if(some_condition){ 
      request = new URLRequest(getNextImagePath(); 
      urlLoader = new URLLoader(); 
      urlLoader.addEventListener(Event.COMPLETE, onComplete); 
      urlLoader.load(request); 
     } 
    }  
} 

function onComplete(event:Event) { 
    parent.addChild(createImageFromData(this.data)); 
}