我循环遍历一小组文件名以从远程服务器获取并在本地保存。这个工作正常。
问题是,我需要在下载完成后运行我的下一个功能。
目前,我的函数,我们称之为step2(),在所有FileStreams完成之前调用(事实上,在该函数开始之前调用它!)
我读到使用openAsynch时有一个完整的事件监听器,但我需要检查所有文件,例如已写入3个远程swfs),然后启动step2()函数。
我该如何解决这个问题?
以下代码:
function onPlaylistComplete(e:Event)
{
var myArray:Array = new Array();
for each(var i in list_of_files)
{
myArray.push(i);
}
for(i = 0; i < myArray.length; i++)
{
swfItem = myArray[i];
var urlString:String = site_url + myArray[i];
var urlReq:URLRequest = new URLRequest(urlString);
var urlStream:URLStream = new URLStream();
urlStream.addEventListener(Event.COMPLETE, urlStreamComplete(swfItem));
urlStream.load(urlReq);
}
function urlStreamComplete(swfItem):Function
{
var downloadSwf:Function = function (event:Event):void {
var fileData:ByteArray = new ByteArray();
var stream = event.target;
stream.readBytes(fileData, 0, stream.bytesAvailable);
try {
var f : File = File.documentsDirectory.resolvePath(swfItem);
var fs : FileStream = new FileStream();
fs.addEventListener(Event.COMPLETE, fileCompleteHandler);
fs.openAsync(f, FileMode.WRITE);
fs.writeBytes(fileData);
}
catch (err : Error) {
trace(err.message);
}
}
return downloadSwf;
}
function fileCompleteHandler(e:Event):void {
e.target.close();
}
step2(); // this seems to run before UrlStreamComplete()
}
答案 0 :(得分:0)
你不能移动step2();在fileCompleteHandler函数的末尾? 因为此时step2();经过之后调用(i = 0; i&lt; myArray.length; i ++) 循环(这是早期的方法)。
答案 1 :(得分:0)
问题for loop
它永远不会与异步模型一起使用。所以最好需要使用递归函数。
downloadAllFiles方法第二个arg是所有下载完成时调用的函数。然后你可以调用step2()或其他任何东西。
确保在下载IOErrorEvent等文件时出现任何问题......
downloadAllFiles(myArray,function():void
{
step2();
});
function downloadAllFiles(myArray:Array, complete:Function):void
{
if(myArray && myArray.length == 0)
{
if(complete)
complete.call();
return;
}
swfItem = myArray.shift();
var urlString:String = site_url + swfItem;
var urlReq:URLRequest = new URLRequest(urlString);
var urlStream:URLStream = new URLStream();
urlStream.addEventListener(Event.COMPLETE, function (event:Event):void
{
var fileData:ByteArray = new ByteArray();
var stream = event.target;
stream.readBytes(fileData, 0, stream.bytesAvailable);
try {
var f : File = File.documentsDirectory.resolvePath(swfItem);
var fs : FileStream = new FileStream();
fs.addEventListener(Event.CLOSE, function(closeEvent:Event):void
{
downloadAllFiles(myArray,complete);
return;
});
fs.openAsync(f, FileMode.WRITE);
fs.writeBytes(fileData);
}
catch (err : Error)
{
trace(err.message);
}
});
urlStream.load(urlReq);
}
答案 2 :(得分:0)
您缺少的方法是检查列表中的所有文件是否已加载, 3vliguy 是否正确且您的step2();
应该在完整的处理程序中但是,并非单独,您还必须测试是否加载了所有文件。你可以用各种方式做到这一点,例如:使用文件计数器,当它为0(加载所有文件)时,你将执行step2()
否则你将忽略它并减少计数器。
P.S。 Raja Jaganathan 方式也可以正常工作,只有排队加载,而计数器则可以在开头加载所有文件。