59 # 异步串行和异步并发删除目录

简介: 59 # 异步串行和异步并发删除目录

异步文件操作api

  1. 删除操作:删除文件 fs.unlink,删除目录 fs.rmdir
  2. 提供有关文件的信息:fs.stat 返回的对象里有 isFile(是否是文件)、isDirectory(是否是文件系统目录)
  3. 读取目录的内容:fs.readdir

异步串行删除

异步串行删除:把所有的异步逻辑串成一根线

const fs = require("fs");
const path = require("path");
function rmdir(dir, cb) {
    fs.stat(dir, (err, statObj) => {
        // 首先需要判断 dir 是否是文件夹
        if (statObj.isDirectory()) {
            fs.readdir(dir, (err, dirs) => {
                dirs = dirs.map((d) => path.join(dir, d));
                console.log("dir---dirs---->", dir, dirs);
                // 当前层节点的索引,用于记录删除的个数
                let index = 0;
                function next() {
                    // 如果 index === dirs.length 标明 dir 目录下的文件和文件夹都删除完毕了
                    if (index === dirs.length) return fs.rmdir(dir, cb);
                    let currentDir = dirs[index++];
                    rmdir(currentDir, next);
                }
                next();
            });
        } else {
            fs.unlink(dir, cb);
        }
    });
}
rmdir("a", (err) => {
    console.log("异步串行删除");
});

执行代码

异步并行删除

function rmdir(dir, cb) {
    fs.stat(dir, (err, statObj) => {
        // 首先需要判断 dir 是否是文件夹
        if (statObj.isDirectory()) {
            fs.readdir(dir, (err, dirs) => {
                dirs = dirs.map((d) => path.join(dir, d));
                console.log("dir---dirs---->", dir, dirs);
                // 先判断是否有子目录,没有直接删除
                if (dirs.length === 0) return fs.rmdir(dir, cb);
                // 用来累加删除的个数
                let index = 0;
                function done() {
                    // 条件相等表明子目录删除完了,就可以删除父目录
                    if (++index === dirs.length) fs.rmdir(dir, cb);
                }
                // 循环并发删除子目录
                for (let i = 0; i < dirs.length; i++) {
                    let currentDir = dirs[i];
                    // 每个删除完之后,累加删除的个数
                    rmdir(currentDir, done);
                }
            });
        } else {
            fs.unlink(dir, cb);
        }
    });
}
rmdir("k", (err) => {
    console.log("异步并行删除");
});

执行代码

目录
相关文章
|
前端开发
异步转同步的几种方法
在循环等待中,我们可以使用一个变量来指示异步操作是否已完成。然后,我们可以在循环中检查该变量,如果它指示异步操作已完成,则退出循环。
552 0
|
6月前
|
负载均衡 算法 前端开发
同步和异步
同步和异步
86 0
|
6月前
|
Python
同步和异步的区别
同步和异步的区别
|
JavaScript 前端开发 UED
同步和异步区别
同步和异步区别
151 0
|
6月前
同步和异步的区别?
同步和异步的区别?
160 0
|
6月前
|
存储 JavaScript 前端开发
|
6月前
|
前端开发 JavaScript
同步和异步有什么区别
同步和异步有什么区别
218 0
同步和异步[多线程的异步执行操作]
同步和异步[多线程的异步执行操作]
52 0
|
消息中间件 前端开发 数据库
同步与异步详细区别
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
|
前端开发
21、同步与异步(三种方法)
21、同步与异步(三种方法)
146 0