时间:2013-12-13 作者:lishalongfa 分类: 无
在For循环里涉及到了异步处理的时候 异步执行的结果与循环本身有影响的冲突问题 通俗点 就是 循环执行的效率是很高的 那么异步可能还没有执行完 就到了下一个循环 而如果异步处理里 涉及到了循环里获取的数据 那么这个数据 往往只有最后一次的数据才起作用 如果解决这个问题呢 ?(如果还没理解 看代码就可以懂了哈)
为了说明问题 先列出来有问题的代码(摘要):
第一层:循环过程
for(var i:int = 0; i <= dialogData.length - 1; i++)
{
var dialogObj:Object = dialogData[i] as Object;
var = dialogObj.url;
dialogLeft = dialogObj.left;
dialogTop = dialogObj.top;
dialogRight = dialogObj.right;
dialogBottom = dialogObj.bottom;
this.proLoadDialog(url);
}
第二层:注册监听
private function proLoadDialog(dialongURL:String = "",dialogObj:Object = null):void
{
info = ModuleManager.getModule(url);
info.data =
{id:id,
label: label,
icon: icon
};
info.addEventListener(ModuleEvent.READY, dialogReadyHandler);
info.load();
}
第三层:异步处理过程
private function dialogReadyHandler(event:ModuleEvent):void
{var info:IModuleInfo = event.module;
moduleTable.add(info.url, info);
......
}
上面 就是一个典型的错误的例子 错在哪里呢?
每一次循环都取出来变量 而在循环内部又直接用这些变量 直接传递这些参数到其他函数 这样的话 就导致循环已经到了最后一次 但是第一次的异步处理可能还没有结束 而这时 参数的值已经是最后一次循环的值了 就使得你只能看到循环的最后一次处理效果 这显然不是我们想看到的
那么怎么处理呢
用数组处理 把数据都取出来后放在一个数组里 数组声明在循环外部 然后 在循环里的函数调用前对数据进行一次处理 比方说 splice(0,1) 删除0索引位置的元素 那么数组就是第一个元素了 把这个参数取出来传递给异步处理函数 最后在异步处理完毕后 再调用一下循环里的那个函数 就可以了 其实就是保证了 每一次处理的时候数组里只有一组参数就行了 ......
下面贴出来正确的处理代码(摘要):
第一层:
private var dialogArray:Array;
private function loadProDialog(event:ConfigDataEvent):void
{
var dialogData:Array = event.data as Array;
dialogArray = new Array();
for(var i:int = 0; i<=dialogData.length - 1; i++)
{
var dialogObj:Object = dialogData[i] as Object;
var = dialogObj.url;
dialogArray.push(dialogObj);
}
loadPreDialog();
}
第二层:
private function loadPreDialog():void
{
if (dialogArray.length)
{var ctl:Object = dialogArray[0];
id = ctl.id;
dialogLeft = ctl.left;
dialogTop = ctl.top;
dialogRight = ctl.right;
dialogBottom = ctl.bottom;
dialogArray.splice(0, 1);
proLoadDialog(ctl.url,ctl);
}}
第三层:
private function proLoadDialog(dialongURL:String = "",dialogObj:Object = null):void
{ //处理传经来的object数据
info = ModuleManager.getModule(url);
info.data =
{id:id,
label: label,
icon: icon};
info.addEventListener(ModuleEvent.READY, dialogReadyHandler);
info.load();}
private function dialogReadyHandler(event:ModuleEvent):void
{......
loadPreDialog();
}
好了 问题已经解决了 感兴趣的朋友可以写个简要的例子测试一下 是完全可行的!
完毕收工!
转:http://hi.baidu.com/gis_idea/item/571e5bd2789c75be32db9074