2017-06-05 77 views
1

我已经写在node.js中运行下面的JavaScript代码:有没有办法同步等待在Javascript中完成递归异步函数?

const fs = require("fs"); 
const path = require("path"); 

var copy = function(paramSource, paramDestination, paramCallback) { 
    if (fs.existsSync(paramDestination)) { 
    return paramCallback("Destination Exists"); //TODO make formal error code 
    } else { 
    fs.lstat(paramSource, function(error, sourceStats) { 
     if (error) { 
     return paramCallback(error); 
     } else { 
     if (sourceStats.isDirectory()) { 
      fs.readdir(paramSource, function(error, sourceContents) { 
      if (error) { 
       return paramCallback(error); 
      } else { 
       fs.mkdir(paramDestination, sourceStats.mode, function(error) { 
       if (error) { 
        paramCallback(error); 
       } else { 
        if (sourceContents.length > 0) { 
        sourceContents.forEach(function(sourceChild) { 
         copy(path.join(paramSource, sourceChild), path.join(paramDestination, sourceChild), paramCallback); 
        }); 
        } 
        return paramCallback(null, paramDestination); 
       } 
       }); 
      } 
      }); 
     } else { 
      var sourceFile = fs.createReadStream(paramSource); 
      var destinationFile = fs.createWriteStream(paramDestination); //TODO permissions 
      sourceFile.on("error", function(error) { 
      return paramCallback(error); 
      }); 
      destinationFile.on("error", function(error) { 
      return paramCallback(error); 
      }); 
      sourceFile.on("close", function() { 
      //return paramCallback(null, paramSource); 
      }); 
      destinationFile.on("close", function() { 
      return paramCallback(null, paramDestination); 
      }); 
      sourceFile.pipe(destinationFile); 
     } 
     } 
    }); 
    } 
}; 

var entities = 0; 

copy("/home/fatalkeystroke/testing/directory_01", "/home/fatalkeystroke/testing/directory_01_copy", function(error, name) { 
    if (error) { 
    console.log(error); 
    } else { 
    console.log(name); 
    entities++; 
    } 
}); 

console.log("Copied " + entities + " entities."); 
console.log("Program Done."); 

这是一个从我工作的一个应用程序测试exerpt。我想保持copy()函数的异步性质,但是我也想知道完整副本何时完成的方式(因为与entities相关的代码暗示)。理由是因为我希望能够告诉我们什么时候完成了,但是还要实现进度跟踪功能。

有没有办法同步等待在Javascript中完成递归异步函数?

+2

没有,但异步/ AWAIT语法可以使你的代码看起来好像你。 – pvg

+1

“同步等待完成异步功能”是什么意思?这不是'paramCallback'的目的吗? – guest271314

+3

想了一会儿,你会意识到这是多么不可能:p –

回答

-1

这可以用顺序执行器nsynjs完成。您的代码将改变如下:

var copy = function (src,dst) { 
    if(nsynFs.lstat(nsynjsCtx, src).data.isDirectory()) { 
     var files = nsynFs.readdir(nsynjsCtx, src).data; 
     nsynFs.mkdir(nsynjsCtx,dst); 
     for(var i=0; i<files.length; i++) { 
      var f=files[i]; 
      console.log(f); 
      copy(src+"/"+f, dst+"/"+f); 
     } 
    } 
    else { // is File 
     var input = nsynFs.open(nsynjsCtx,src,'r').data; 
     var output = nsynFs.open(nsynjsCtx,dst,'w').data; 
     var buf = Buffer.alloc(4096); 
     while(true) { 
      var readCnt = nsynFs.read(nsynjsCtx,input,buf,0,4096,null).data; 
      if(!readCnt) 
       break; 
      nsynFs.write(nsynjsCtx,output,buf,0,readCnt,null); 
     } 
     nsynFs.close(nsynjsCtx,input); 
     nsynFs.close(nsynjsCtx,output); 
    } 
}; 

copy("test1","test2"); 

请在这里看到完整的工作示例:https://github.com/amaksr/nsynjs/blob/master/examples/node-copy-files/index.js