关于在for循环里异步函数执行的控制方法(转)

时间: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

标签: gis flex

WRITTEN BY

avatar