for循环中的Actionscript 3 URL Loader

Action Script 3 URLLoader in for loop

我有 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 循环循环六次后执行。

无论如何我可以得到正确的数据到正确的数组。

谢谢

我推荐你使用字典。

创建新词典:

var dict:Dictionary = new Dictionary();

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

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/);
...

由于您使用 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