动作脚本3 for循环中的URLLoader

时间:2015-05-13 15:58:51

标签: arrays actionscript-3 for-loop addeventlistener urlloader

我开始使用7个阵列:

private var listArray:Array = new Array();
private var oneArray:Array = new Array();
private var twoArray:Array = new Array();
private var threeArray:Array = new Array();
private var fourArray:Array = new Array();
private var fiveArray:Array = new Array();
private var sixArray:Array = new Array();

listArray包含6个文本文件名的字符串元素。 类似的东西:

1.txt
2.txt
3.txt
4.txt
5.txt
6.txt

目前所有其他阵列都是空的。

我写了一个这样的for循环:

for (var i:int = 0; i < listArray.length; i++)
{
    var urlRequest:URLRequest = new URLRequest(File.documentsDirectory.resolvePath(listArray[i]).url);
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE, completeHandler);
    try
    {
        urlLoader.load(urlRequest);
    }catch (error:Error){
        trace("Cannot load : " + error.message);
    }
}

如果没有for循环,我知道我只能对一个数据数组执行此操作:

private function completeHandler(e:Event):void
{
    oneArray = e.target.data.split(/\r\n/);
}

在这里,我想尝试一些工作:

oneArray包含来自1.txt

的数据

twoArray包含来自2.txt

的数据

等......

sixArray包含来自6.txt

的数据

问题:

我知道completeHandler函数只在for循环六次后执行。

无论如何我可以将正确的数据输入正确的数组。

由于

2 个答案:

答案 0 :(得分:0)

我建议你使用词典。

创建新词典:

var dict:Dictionary = new Dictionary();

将URLLoader类的实例绑定到文件名:

var urlRequest:URLRequest = ...
var urlLoader:URLLoader = new URLLoader();
dict[urlLoader] = listArray[i];

completeHandler中,您可以获取文件名:

trace(dict[e.currentTarget]);

添加if语句以达到目标。

if (dict[e.currentTarget] == "1.txt")
    oneArray = e.target.data.split(/\r\n/);
else if (dict[e.currentTarget] == "2.txt")
    twoArray = e.target.data.split(/\r\n/);
...

答案 1 :(得分:0)

由于您使用AIR从文件系统加载数据,因此您不必异步执行此操作。您可以像这样同步加载它:

function readTxtList(url:String):Array {
    var file:File = File.documentsDirectory.resolvePath(url);
    var fileStream:FileStream = new FileStream();
    fileStream.open(file, FileMode.READ);
    var text:String = fileStream.readUTFBytes(fileStream.bytesAvailable);
    fileStream.close();
    return text.split("\r\n");
}

现在您可以直接分配每个值:

var oneArray:Array = readTxtList("1.txt");
var twoArray:Array = readTxtList("2.txt");
// etc