找出涉及异步操作的递归何时完成

时间:2010-10-08 08:23:45

标签: actionscript-3 recursion air

我有一个递归调用,其中包括一个asyn操作(文件复制)..
我想知道递归调用何时完成(以及所有asyn操作)。

    private function copyInto(directoryToCopy:File, locationCopyingTo:File):void
        {
          var directory:Array = directoryToCopy.getDirectoryListing();
          //get list of files in dir 

          for each (var f:File in directory)
          {
            if (f.isDirectory)
              copyInto(f, locationCopyingTo.resolvePath(f.name));
            else
             {
               f.copyToAsyn(locationCopyingTo.resolvePath(f.name), true);
               f.addEventListener(Event.COMPLETE, onFilecopied);
              }
          }    
        }

function onFileCopied(event){ 
    alert(event.target); // [object File] 
} 

基本上我需要的是将文件夹结构复制到另一个驱动器和文件夹 被复制包含一些100-200MB的文件,需要时间来复制,这些 消除用户界面和Flash播放器 文件被复制后,我想做更多的事情(希望没有 阻止UI)。

任何帮助?

全部谢谢。

2 个答案:

答案 0 :(得分:1)

您可以设置要复制的文件的静态类级计数器,当您找到要复制的另一个文件时,该计数器会递增;当事件函数发出复制结束信号时,会递减。

private static fileCounter:int = 0;

并在循环中:

++fileCounter;
f.addEventListener(Event.COMPLETE, onFilecopied);
f.copyToAsync(locationCopyingTo.resolvePath(f.name), true);

并在事件处理程序中:

function onFileCopied(event)
{ 
    if ( --fileCounter == 0 )
        trace("finished");
} 

但是很弱,因为你无法从错误中恢复,也不知道哪些文件已被复制。要构建更强大的解决方案,您不仅可以存储文件计数器,还可以存储类中的文件名列表:

class FileCopyInfo
{
...
    private var fileName:String;
    private var finished:Boolean;
}

答案 1 :(得分:1)

计算copyToAsync的调用,并在我的示例中使用类似doCopy的包装函数。

private var copyCount: int = 0;
private var isCopying: Boolean = false;

public function doCopy(directoryToCopy:File, locationCopyingTo:File):void
{
    isCopying = true;
    try {
      copyInto((directoryToCopy, locationCopyingTo);
    finally {
      isCopying = false;
    } 
}

private function copyInto(directoryToCopy:File, locationCopyingTo:File):void {
    var directory:Array = directoryToCopy.getDirectoryListing();

    for each (var f:File in directory) {
        if (f.isDirectory)
            copyInto(f, locationCopyingTo.resolvePath(f.name));
        else {
            copyCount++; 
            f.addEventListener(Event.COMPLETE, onFileCopied);
            f.copyToAsync(locationCopyingTo.resolvePath(f.name), true);
        }
    }    
}

function onFileCopied(event: Event): void
{ 
    copyCount--;
    if (copyCount == 0 && !isCopying)
        trace("finished");
} 

重要提示: isCopying标志检查copyInto功能是否仍在运行,否则您可能遇到copyCount == 0的情况,但复制还没完。