代码之家  ›  专栏  ›  技术社区  ›  Amitd

找出涉及异步操作的递归何时结束

  •  1
  • Amitd  · 技术社区  · 15 年前

    我有一个递归调用,其中包括一个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播放器。
    在文件被复制之后,我想做更多的事情(希望没有 阻止用户界面)。

    有什么帮助吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   splash    15 年前

    数一数 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 ,但复制尚未完成。

        2
  •  1
  •   vulkanino    15 年前

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

    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;
    }