javascript - 在 Node 脚本末尾运行行?

标签 javascript node.js asynchronous

我编写了一个脚本,可以递归地异步修改目录中的 js 文件。它由 search(dirname) 组成在目录中搜索 js 文件的函数,以及 modify(filename)哪个进行修改。

let totalFilesSearched = 0;

const search = (dir) => {
    fs.readdir(dir, (err, list) => {
        if (err) return;
        list.forEach((filename) => {
            const filepath = path.join(dir, filename);
            if (filename.endsWith('.js')) {
                modify(filepath);
            } else if (fs.lstatSync(filepath).isDirectory()) {
                search(filepath);
            }
        })
    });
}

const modify = (filename) => {
    fs.readFile(filename, 'utf8', (err, data) => {
        if (err) console.log(err);
        // ... my modification code ...
        totalFilesSearched++;
    });
}

search(args[0])
console.log(`Total files searched: ${totalFilesSearched}`);

我想打印出 totalFilesSearched在我的脚本末尾,但因为我的代码是异步的,所以它只打印 Total files searched: 0马上。

有谁知道我要如何等到脚本即将结束才能打印出来?我遇到了麻烦,因为我的 search()modify()函数是异步的。

最佳答案

改用 Promises,然后在一切都解决后调用 console.log。使用 promisify 将回调转换为 promise:

const { promisify } = require('util');
const readFile = promisify(fs.readFile);
const readDir = util.promisify(fs.readdir);

const search = (dir) => (
  readDir(dir).then((list) => (
    Promise.all(list.map((filename) => {
      const filepath = path.join(dir, filename);
      if (filename.endsWith('.js')) {
        return modify(filepath); // recursively return the promise
      } else if (fs.lstatSync(filepath).isDirectory()) {
        return search(filepath); // recursively return the promise
      }
    }))
  ))
  .catch(err => void 0)
);

const modify = (filename) => (
  readFile(filename, 'utf8')
    .then((data) => {
      // other code
      totalFilesSearched++;
    }).catch(err => console.log(err))
)

search(args[0])
  .then(() => {
    console.log(`Total files searched: ${totalFilesSearched}`);
  });

关于javascript - 在 Node 脚本末尾运行行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549526/

相关文章:

javascript - 我收到未处理的拒绝(类型错误): router.transitionTo 不是函数。可能出了什么问题?

php - HTML 表单验证

javascript - 碰撞检测在吃 bean 人游戏中不起作用

javascript - 没有匹配时跳出 ReactRouter

mysql - Node js Express 3 app.post 不工作

c# - 如何创建自定义 SynchronizationContext 以便所有延续都可以由我自己的单线程事件循环处理?

node.js - 类型错误 : require(. ..) 不是 SendGrid NodeJS 中的函数

node.js - 当依赖项不是全局时运行 package.json 依赖项

javascript - gjs 中的异步代码在调用回调之前退出

javascript - 使用异步数据获取的服务器端呈现