首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在节点脚本端运行行?

问在节点脚本端运行行?
EN

Stack Overflow用户
提问于 2018-05-27 06:12:48
回答 2查看 49关注 0票数 3

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

代码语言:javascript
复制
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()函数都是异步的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-27 06:23:16

使用承诺代替,然后调用console.log当一切都解决了。使用promisify将回调转换为承诺:

代码语言:javascript
复制
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}`);
  });
票数 2
EN

Stack Overflow用户

发布于 2018-05-28 07:22:38

自我回答:

只需使用process.on('exit', callback_function_to_execute_at_end)

它内置在节点中,您的回调将在进程退出之前立即执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50549526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档