2013-02-18 60 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)); 
}