展开目录
Promise复习,nodejs异步建立多级目录
nodejsPromise
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

因为nodejs的mkdir和mkdirSync本身都不能一次性建立多级目录,所以只能自行编写代码了。

同步模式的递归建立可以写成这样:

var fs=require('fs');
var path=require('path');
function mkdirSync(dir){
  var dirlist=path.resolve(dir).split(path.sep);
  var level=0;
  // 容错建立
  while(dirlist.length>=level)try{
    fs.mkdirSync(dirlist.slice(0,level++).join(path.sep));
  }catch(e){}
  try{
    // 判断文件夹是否存在
    if(!fs.statSync(dir).isDirectory())0();
  }catch(e){
    return false; // 建立失败
  }
  return true; // 建立成功
}
console.log(mkdirSync('/1/2/3/4/5/6/7/8')?'success':'fail');

异步模式也是需要依赖递归的,直接使用callback嵌套写法看上去代码很混乱,而使用Promise就很清晰了,因为Promise的thenable如果返回的是Promise对象,会让执行队列等待这个Promise完成。这种方式可以想象成是一个异步的阻塞,既确保了目录建立的顺序,也避免了同步建立导致整个线程被阻塞。

var fs=require('fs');
var path=require('path');
function mkdir(dir){
  var dirlist=path.resolve(dir).split(path.sep);
  return function callee(last,level){
    return dirlist.length>=level?callee(last.then(function(){
      return new Promise(function(resolve){
        fs.mkdir(dirlist.slice(0,level).join(path.sep),resolve);
      });
    }),level+1):last.then(function(){
      return new Promise(function(resolve,reject){
        fs.stat(dir,function(e,stats){
          if(e || !stats.isDirectory())
            throw e||'directory not exists'; // 建立失败
          resolve(); // 建立成功
        });
      });
    });
  }(Promise.resolve(),0);
};
mkdir('/a/b/c/d/e/f').then(function(){
  console.log('success');
},function(){
  console.log('fail');
});

相关文档

暂无

随便看看

  1. react项目webpack打包时拆分异步加载的文件

  2. 华为等国产手机rem宽度超过实际宽度

  3. word文件命令行打印

  4. pip安装nltk临时使用国内源

  5. ipsec vpn 添加新账号

  6. nodejs 长连接

  7. curl用法

  8. nodejs socks5

  9. git删除远程分支

  10. webrtc服务搭建

  11. 树莓派配置wifi热点

  12. putty使用http代理连接服务器

  13. centos查看最近一次的开机时间

  14. mysql导出csv文件

  15. sendmail用nginx做代理

  16. ie8上Image.onload不触发问题

  17. 简易版事件封装

  18. bootstrap modal弹框导致ie无法获取焦点

  19. 感谢beego陪伴我度过那不靠谱的半年

畅言模块加载中