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
我有 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