(FLEX)AS3,for循环里面加监听,只能取到最后一个元素的取巧方法解决方法

首先申明,本人第一次写博客,不足之处还望大家见谅和不吝赐教,谢谢。

背景是这样的:由于项目需要,flex中实现批量导入多个文件(.txt,.dat,...),解析数据并保存到数据库中。 

采用FileReferenceList 实现多个文件导入。自然用到filelist.browse()以及file.load()。由于load()加载还未完成,继续for循环,导致最后循环结束时,取到的file.data是最后一个元素的。下面先列出修改之前的代码:

private var file:FileReference = new FileReference();
private var filelist:FileReferenceList= new FileReferenceList();
private var filter:FileFilter = new FileFilter("请选择文件(*.dat)","*.dat");
private var filedatas:ArrayCollection = new ArrayCollection([]);


protected function init(event:FlexEvent):void{
	filelist.addEventListener(Event.SELECT, file_select);
}

/**
 * 选择excel文件
 */
private function click_BrowseXLS(event:MouseEvent):void
{
	filedatas.removeAll();
	filelist.browse([filter]);
}

// 选择 文件,加载文件
private function file_select(e:Event):void{
	for(var i:int=0;i<filelist.fileList.length;i++){
		file = filelist.fileList[i];
		file.load();
		file.addEventListener(Event.COMPLETE,file_complete);
	}
	//调用保存方法
	filelists_complete();
}

protected function file_complete(e:Event):void{
	var obj:Object= new Object();
	obj.fileName = file.name;
	obj.fileSize = file.size;
	obj.fileType = file.type;
	obj.fileRefrence = file.data;
	filedatas.addItem(obj);					
}

//保存方法
protected function filelists_complete():void{
	//相关保存操作
};

  在网上找了很久,解决方案都比较少,或者更多的是基于swf或者图片操作的。结合网上的一些帖子,最终觉得采用针对每一个文件,都新生成一个file对象,当所有的file都加载完成之后,再来执行我们的保存方法,具体代码如下:

private var filelist:FileReferenceList= new FileReferenceList();
private var filter:FileFilter = new FileFilter("请选择文件(*.dat)","*.dat");
private var filedatas:ArrayCollection = new ArrayCollection([]);
private var s:int = 0;//用于判断文件是否全部加载(load)完


protected function init(event:FlexEvent):void{
	filelist.addEventListener(Event.SELECT, file_select);
}

/**
 * 选择excel文件
 */
private function click_BrowseXLS(event:MouseEvent):void
{
	s = 0;
	filedatas.removeAll();
	filelist.browse([filter]);
}

// 选择 文件,加载文件
private function file_select(e:Event):void{
	for(var i:int=0;i<filelist.fileList.length;i++){
		var file:FileReference = FileReference(filelist.fileList[i]);
		file.load();
		file.addEventListener(Event.COMPLETE,file_complete);
	}
	//调用保存方法
	filelists_complete();
}

protected function file_complete(e:Event):void{
	//被调用  filelist.fileList.length  次之后,即所有文件都加载完成之后,才调用加载数据的方法
	s = s + 1;
	if(s == filelist.fileList.length){
		for(var i:int=0;i<filelist.fileList.length;i++){
			var f:FileReference = FileReference(filelist.fileList[i]);
			var obj:Object= new Object();
			obj.fileName = f.name;
			obj.fileSize = f.size;
			obj.fileType = f.type;
			obj.fileRefrence = f.data;
			filedatas.addItem(obj);
		}
	}
}

//保存方法
protected function filelists_complete():void{
	//相关保存操作
};

 对比前后代码不难发现,其实我们就是在监听完成方法file_complete()里面,加上一个判断。如果选中了N个文件,如果该方法已经被调用了N,就意味着所有文件都已经load(加载)完成,然后我们再循环一次所有的文件,分别取到f.data,就能得到我们想要的数据,之后再执行我们的保存方法,该功能即可实现。之后将数据传到后台,至于怎么去解析数据,后面找机会再出心得。谢谢

原文地址:https://www.cnblogs.com/zijianhua/p/5704161.html